..... ..... ..... // Hier will ich was einfügen! /* Und du hast IDC_NETWORKMODE als define dingens festgelet bekommst du mit GetDlgItem( hwndDlg, IDC_NETWORKMODE) das handle auf die ComboBox.*/ //Also ComboBox_AddString( GetDlgItem( hwndDlg, IDC_NETWORKMODE), "Guten Tag"); ..... } return false; }
这么多人搞一个对话框? 哈哈你的对话框上有具有接受焦点的控件 所以你的对话框是没法收到WM_KEYDOWN消息的 这些消息全部给控件拦住了 要先在对话框拦截该消息,MFC或者WTL的做法是重写PreTranslateMessage这个虚函数 你现在是基于纯WIN32 API 所以你可以在消息循环里截获一下 // Main message loop: while (GetMessage(&msg, NULL, 0, 0)) {
if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)) { if (IsWindow(g_hDlg)&&(IsDialogMessage(g_hDlg, &msg)||IsChild(g_hDlg,msg.hwnd))) { if (msg.message==WM_KEYDOWN) { MessageBox(NULL,_T("WM_KEYDOWN"),_T("你好!"),MB_OK); }
while (GetMessage(&msg, NULL, 0, 0))
{ TranslateMessage(&msg);
DispatchMessage(&msg);
}
这样有问题吗?
基于MFC 的CDialogBox ?
// 打开主配置界面
DialogBox(g_hInstance, MAKEINTRESOURCE(IDD_MAIN_CONFIG_DLG), NULL, MainCfgDlgProc); // 回调函数
INT_PTR __stdcall MainCfgDlgProc(HWND hWndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)有什么问题吗?
http://www.khgl.cn/html/62/n-1148262.html
和这个问题差不多
DialogBoxPro
lParam)
{ switch( msg)
{
.....
.....
.....
// Hier will ich was einfügen!
/* Und du hast IDC_NETWORKMODE als define dingens festgelet
bekommst du mit GetDlgItem( hwndDlg, IDC_NETWORKMODE) das
handle auf die ComboBox.*/
//Also
ComboBox_AddString( GetDlgItem( hwndDlg, IDC_NETWORKMODE),
"Guten Tag");
.....
} return false;
}
hWnd = CreateDialog(g_hInstance, (LPCTSTR)(IDD_BASIC_DLG), hWndDlg, (DLGPROC)BasicCfgDlgProc); hWnd = CreateDialog(g_hInstance, (LPCTSTR)(IDD_BASIC_DLG), hWndDlg, (DLGPROC)BasicCfgDlgProc);//////////////////////////////////////////////////////////////////////////
// 基本设置对话框窗口过程
INT_PTR __stdcall BasicCfgDlgProc(HWND hWndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
return m_BasicCfgDlg.DlgProc(hWndDlg, uMsg, wParam, lParam);
}
INT_PTR BasicCfgDlg::DlgProc(HWND hWndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
case WM_KEYDOWN:
{
OnKeyDown(hWndDlg, uMsg, wParam, lParam);
}
break;
case WM_SYSKEYDOWN:
{
OnKeyDown(hWndDlg, uMsg, wParam, lParam);
}
case WM_KEYUP:
{
OnKeyUp(hWndDlg, uMsg, wParam, lParam);
}
break;
case WM_PAINT:
{
OnPaint(hWndDlg, uMsg, wParam, lParam);
}
break;
case WM_INITDIALOG:
{
OnInitDialog(hWndDlg, uMsg, wParam, lParam);
}
break;
case WM_COMMAND:
{ }
break;
case WM_DESTROY:
break;
case WM_LBUTTONDOWN:
{
int x = 0;
}
break;
default:
return DefWindowProc(hWndDlg, uMsg, wParam, lParam);
} return 0;
}
你仅仅这些语句是不够的,还要在回调函数中响应键盘消息
BOOL CALLBACK DialogProc(HWND hWndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
case WM_KEYDOWN:
{
OnKeyDown(hWndDlg, uMsg, wParam, lParam);
//这是你的按下键的消息
}
break;
case WM_SYSKEYDOWN:
{
OnKeyDown(hWndDlg, uMsg, wParam, lParam);
//这是你的系统按键的消息
}
case WM_KEYUP:
{
OnKeyUp(hWndDlg, uMsg, wParam, lParam);
//这是你的弹起键的消息
}
break;
case WM_PAINT:
{
OnPaint(hWndDlg, uMsg, wParam, lParam);
}
break;
case WM_INITDIALOG:
{
OnInitDialog(hWndDlg, uMsg, wParam, lParam);
}
break;
case WM_COMMAND:
{ }
break;
case WM_DESTROY:
break;
case WM_LBUTTONDOWN:
{
int x = 0;
}
break;
default:
return DefWindowProc(hWndDlg, uMsg, wParam, lParam);
} return 0;
}
while (GetMessage(&msg, NULL, 0, 0))
{ TranslateMessage(&msg);
DispatchMessage(&msg);
}
这个是消息循环
子对话框的消息过程是按下面的方式写的
BOOL CALLBACK DialogProc(HWND hWndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
case WM_KEYDOWN:
{
OnKeyDown(hWndDlg, uMsg, wParam, lParam);
//这是你的按下键的消息
}
break;
case WM_SYSKEYDOWN:
{
OnKeyDown(hWndDlg, uMsg, wParam, lParam);
//这是你的系统按键的消息
}
case WM_KEYUP:
{
OnKeyUp(hWndDlg, uMsg, wParam, lParam);
//这是你的弹起键的消息
}
break;
case WM_PAINT:
{
OnPaint(hWndDlg, uMsg, wParam, lParam);
}
break;
case WM_INITDIALOG:
{
OnInitDialog(hWndDlg, uMsg, wParam, lParam);
}
break;
case WM_COMMAND:
{ }
break;
case WM_DESTROY:
break;
case WM_LBUTTONDOWN:
{
int x = 0;
}
break;
default:
return DefWindowProc(hWndDlg, uMsg, wParam, lParam);
} return 0;
}
解释详细点啊,郁闷死我了,搞了好几天了
所以你的对话框是没法收到WM_KEYDOWN消息的
这些消息全部给控件拦住了
要先在对话框拦截该消息,MFC或者WTL的做法是重写PreTranslateMessage这个虚函数
你现在是基于纯WIN32 API
所以你可以在消息循环里截获一下
// Main message loop:
while (GetMessage(&msg, NULL, 0, 0))
{
if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
{
if (IsWindow(g_hDlg)&&(IsDialogMessage(g_hDlg, &msg)||IsChild(g_hDlg,msg.hwnd)))
{
if (msg.message==WM_KEYDOWN)
{
MessageBox(NULL,_T("WM_KEYDOWN"),_T("你好!"),MB_OK);
}
}
else
{
TranslateMessage(&msg);
DispatchMessage(&msg);
} }
}