2011-12-15 106 views
0

我正在嘗試爲C++應用程序運行GUI,但我遇到按鍵事件的問題。基本上,一切工作正常,只要我不點擊任何按鈕(主窗口註冊關鍵事件),但只要我點擊一個按鈕,主窗口失去焦點,它不再捕獲關鍵事件。這可能是一個愚蠢的問題,但我對C++非常陌生。這是一些我使用的代碼:當按下子按鈕時C++窗口失去焦點

hwnd = CreateWindowEx (
       0,     /* Extended possibilites for variation */ 
       szClassName,   /* Classname */ 
       "Application Name", /* Title Text */ 
       WS_OVERLAPPEDWINDOW, /* default window */ 
       CW_USEDEFAULT,  /* Windows decides the position */ 
       CW_USEDEFAULT,  /* where the window ends up on the screen */ 
       540,     /* The programs width */ 
       250,     /* and height in pixels */ 
       HWND_DESKTOP,  /* The window is a child-window to desktop */ 
       NULL,    /* No menu */ 
       hThisInstance,  /* Program Instance handler */ 
       NULL     /* No Window Creation data */ 
      ); 

的一個按鈕的創作:

主窗口的創建

CreateWindow(TEXT("button"), TEXT("Start"), 
       WS_VISIBLE | WS_CHILD, 
       x, y, width, height, 
       hwnd, (HMENU) 6, NULL, NULL); 

我也注意到,每當我點擊一個按鈕,WM_KILLFOCUS事件被解僱,這就是爲什麼我認爲這是一個焦點問題。我也嘗試捕獲WM_KILLFOCUS事件,然後使用SetActiveWindow再次設置焦點,但是這使我的程序崩潰。

任何幫助將不勝感激:)

+0

按鈕是主窗口的一部分,誰獲得焦點呢?還是你用按鈕創建一個對話框,並且當你按下對話框中的按鈕時,對話框會獲得焦點? – PlasmaHH 2011-12-15 11:18:07

+0

我只有一個帶有按鈕的主窗口。我在提供的代碼中創建窗口和按鈕,我不創建任何對話框。我不知道誰是重點,因爲每個按鈕都是一個窗口,我假設一旦點擊按鈕,按鈕就會獲得焦點。 – npinti 2011-12-15 11:20:25

+0

我無法理解:(HMENU)6爲什麼需要它? – 2011-12-15 11:29:00

回答

2

原來我使用了錯誤的功能(SetWindowActive)。阿薩夫列維的答案似乎對我來說很複雜,我認爲可能有另一種解決方法。我設法找到了SetFocus函數,它通過提供它的句柄給任何給定的窗口提供焦點。

爲了使其工作,我需要做的是,一旦必要的代碼在WM_COMMAND塊內執行,我就用主窗口的句柄調用SetFocus函數。這讓焦點回到了主窗口並允許它接收事件。

請注意,將SetFocus置於WM_KILLFOCUS塊中將導致按鈕及其中的任何其他組件無法響應事件。

2

這是設計。主窗口是window,但按鈕​​是window,在任何給定時間只有一個窗口可以有焦點。如果你不想讓按鈕「偷取」焦點,添加一個OnFocus處理程序(或攔截WM_SETFOCUS),並立即將焦點返回到上一個窗口(我相信它在WM_SETFOCUSWPARAM)。

一個簡單的黑客是:

  1. hMyButton = CreateWindow的( 「按鈕」,...)。
  2. 定義MyButtonProc(HWND,UINT,WPARAM,LPARAM)函數。
  3. 調用SetWindowLong(hMyButton,GWL_WNDPROC,(LONG)MyButtonProc)。將此函數返回的值保存在g_OldButtonProc中。
  4. Inside MyButtonProc()捕獲WM_SETFOCUS,並調用SetFocus(hMyMainWindow)。 除非消息是WM_SETFOCUS,否則總是在MyButtonProc()函數的末尾返回CallWindowProc(h_OldButtonProc,hwnd,msg,...)。

這將做的伎倆(測試)。

相關問題