2013-07-31 38 views
0

我剛剛從Winforms切換,一切對我來說都很難。我面臨着一個又一個問題。下一個,是...如何用WinAPI製作可編輯的TextBox?

#ifndef ActivationWindow_h 
#define ActivationWindow_h 

#include <windows.h> 

class ActivationWindow 
{ 
    static HWND main_wnd; 
    static HWND lbl_login_desc; 
    static HWND txt_login; 

public: 
    static void CreateWnd() 
    { 
     MSG msg = { 0 }; 
     WNDCLASS wc = { 0 }; 
     wc.lpfnWndProc = WndProc; 
     wc.hInstance = GetModuleHandle(NULL); 
     wc.hbrBackground = (HBRUSH)(COLOR_BACKGROUND); 
     wc.lpszClassName = "actwnd"; 

     if(!RegisterClass(&wc)) 
      return; 

     if(!(main_wnd = CreateWindow(wc.lpszClassName, "Program activation", WS_OVERLAPPEDWINDOW | WS_VISIBLE, 0, 0, 640, 480, 0, 0, wc.hInstance, NULL))) 
      return; 

     lbl_login_desc = CreateWindow("static", "ST_U", WS_CHILD | WS_VISIBLE | WS_TABSTOP, 10, 10, 50, 20, main_wnd, (HMENU)(501), wc.hInstance, NULL); 
     SetWindowText(lbl_login_desc, "Login: "); 

     txt_login = CreateWindow("edit", "", WS_CHILD | WS_VISIBLE | WS_TABSTOP | ES_LEFT | WS_BORDER, 70, 10, 50, 20, main_wnd, (HMENU)(502), wc.hInstance, NULL); 

     while(GetMessage(&msg, NULL, 0, 0) > 0) 
      DispatchMessage(&msg); 
    } 

    static LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) 
    { 
     switch(message) 
     { 
      case WM_CLOSE: 
       PostQuitMessage(0); 
       break; 

      default: 
       return DefWindowProc(hWnd, message, wParam, lParam); 
     } 

     return 0; 
    } 
}; 

HWND ActivationWindow::main_wnd = NULL; 
HWND ActivationWindow::lbl_login_desc = NULL; 
HWND ActivationWindow::txt_login = NULL; 

#endif ActivationWindow_h 

當顯示窗口時,我無法在TextBox中輸入任何字符。怎麼做?另外,如果我將鼠標指針移動到該文本框,它將變成「I」,如果我將鼠標移動到窗口,鼠標指針仍然是「I」,而不是箭頭。 我該如何解決這個問題?

我看到一些關於這方面的問題,但是那個人告訴他禁用了DirectInput 8並且一切都解決了。我不知道我在用什麼...

回答

3

您需要在您的消息循環中調用TranslateMessageWM_CHAR消息不會生成。

您的光標停留在工字樑上,因爲您沒有在窗口類中設置光標。你從中學到什麼參考並沒有顯示基本的窗口類註冊,它將光標設置爲LoadCursor(NULL, IDC_ARROW),圖標爲LoadIcon(NULL, IDI_APPLICATION)

+0

請問你能說哪裏?有很多地方... – Kosmos

+1

我確實說過...在消息循環裏面。 'while(GetMessage ...'part is the message loop。 – Joel

+0

我的意思是在哪裏xactly?我可以在DispatchMessage之前調用它(&msg);,之後或WndProc內部)在很多情況下或默認情況下...我真的不明白它是如何工作的 – Kosmos

相關問題