2011-08-07 100 views
0

我正在寫一個類似於記事本的示例應用程序,使用Win32函數C &。一旦用戶按下鍵盤上的任何鍵,它將在輸出上顯示爲「Key Pressed:」,然後移動到下一行。當用戶繼續按鍵時,他會到達頁面的末尾,但我發現很難動態滾動垂直條。 我甚至嘗試在WM_CHAR中使用SetScrollInfo動態設置滾動條範圍,但仍然無效。請給我一個方法來做到這一點。示例代碼供您參考。基於用戶輸入動態使用Win32函數滾動

case WM_CHAR: 
     ////////////////////////////////////////////////////////////////////////// 
     hdc = GetDC(hwnd);  
     ////////////////////////////////////////////////////////////////////////// 
     GetTextMetrics(hdc, &tm); 
     cyChar = tm.tmHeight + tm.tmExternalLeading; 
     ////////////////////////////////////////////////////////////////////////// 
     si.cbSize = sizeof(si); 
     si.fMask = SIF_RANGE | SIF_PAGE; 
     si.nMin = 0; 
     si.nMax = iMaxLines; 
     si.nPage = cyClient/cyChar; 
     SetScrollInfo(hwnd, SB_VERT, &si, TRUE); 
     ////////////////////////////////////////////////////////////////////////// 
     wsprintf(szBuffer, TEXT("Key pressed %c, Pos: %d"), wParam, iMaxLines); 
     TextOut(hdc, 0, cyChar * iMaxLines++, szBuffer, lstrlen(szBuffer)); 
     ////////////////////////////////////////////////////////////////////////// 
     ReleaseDC(hwnd, hdc); 
     ////////////////////////////////////////////////////////////////////////// 

     break; 
+0

我不確定這是否有必要,但您的窗口是否具有WS_VSCROLL樣式? – RichieHindle

+0

是的...我有。請找到如下所示的窗口創建代碼。 – kiranbhatter

+0

HWND = CreateWindow的(szClassName, \t \t \t \t \t \t TEXT( 「文本墊」), \t \t \t \t \t \t WS_OVERLAPPEDWINDOW | WM_VSCROLL, \t \t \t \t \t \t CW_USEDEFAULT, \t \t \t \t \t \t CW_USEDEFAULT , \t \t \t \t \t \t CW_USEDEFAULT, \t \t \t \t \t \t CW_USEDEFAULT, \t \t \t \t \t \t NULL, \t \t \t \t \t \t NULL, \t \t \t \t \t \t hInstanc e, \t \t \t \t \t \t NULL); \t ShowWindow(hwnd,iCmdShow); \t UpdateWindow(hwnd); – kiranbhatter

回答

2

您違反了Windows中一個非常基本的編碼模式:只在WM_PAINT事件處理程序的窗口中繪製東西。任何你在別處吸取的東西都不會長存下去,接下來的重繪會抹去它。如通過調整滾動條觸發的那個。

通過使用列表框來簡化此編碼任務。