一个简单的问题,只费一下时间

rbird 2002-06-08 04:06:12
/*我第一次练习用C++写了一个窗口程序(见下面),完全在VC++6.0调试通过。现在的问题是如果焦点不在button按钮上,按ESC键,能退出。但是只要点击了Button,就不能退出了,怎么写Button的消息传递呢?*/
#include<windows.h>
BOOL InitWindow(HINSTANCE hInstance,int nCmdShow);
LRESULT CALLBACK WinProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam);
HWND hwnd;
HINSTANCE hInst;

int PASCAL WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
{
hInst = hInstance;
MSG msg;
if(!InitWindow(hInstance,nCmdShow))return FALSE;
while(1)
{
if(PeekMessage(&msg,NULL,0,0,PM_REMOVE))
{
if(msg.message ==WM_QUIT)break;
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
return msg.wParam ;
}

static BOOL InitWindow(HINSTANCE hInstance,int nCmdShow)
{
HWND hBtn = NULL;

WNDCLASS wc;
wc.style = NULL;
wc.lpfnWndProc =(WNDPROC)WinProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = NULL;
wc.hCursor = NULL;
wc.hbrBackground =(HBRUSH)(COLOR_WINDOW+1);
wc.lpszMenuName = NULL;
wc.lpszClassName ="MyTest";
RegisterClass(&wc);
hwnd = CreateWindow("MyTest","MY first program",WS_POPUP|WS_MAXIMIZE,0,0,GetSystemMetrics(SM_CXSCREEN),GetSystemMetrics(SM_CYSCREEN),NULL,NULL,hInstance,NULL);
if(!hwnd)return FALSE;
ShowWindow(hwnd,nCmdShow);
UpdateWindow(hwnd);
hBtn = CreateWindow( "BUTTON", "Push Button",WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 50, 50, 100, 32,hwnd,NULL,hInst, NULL );

return TRUE;
}

LRESULT CALLBACK WinProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)
{
switch(message)
{
case WM_KEYDOWN:
switch(wParam)
{
case VK_ESCAPE:
MessageBox(hWnd,"退出!","退出",MB_OK);
PostQuitMessage(0);
break;
}
break;
case WM_RBUTTONDOWN:
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
}
return DefWindowProc(hWnd,message,wParam,lParam);
}
...全文
20 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
rbird 2002-06-11
  • 打赏
  • 举报
回复
算了,结帖。哎,
i_doit 2002-06-10
  • 打赏
  • 举报
回复
gz
coldcrane 2002-06-10
  • 打赏
  • 举报
回复
你应该在WinProc()中处理WM_COMMAND消息.
就目前的问题,你需要把消息循环交回主窗口,
这个很简单,只需要在WinProc()的switch里加入:

...
case WM_COMMAND:
 SetFocus(hWnd);
break;
...

就可以了!
rbird 2002-06-10
  • 打赏
  • 举报
回复
能给我写一些代码吗?我的MSDN坏了。又不好装。如果写代码,立即给分。
sttony 2002-06-08
  • 打赏
  • 举报
回复
按钮之类的标准子窗口是没有WndProc的,对他们的消息以WM_COMMAND的形式发送给父窗口,记的不太清楚,好象Msg中的一个成员表示的是按钮的句柄,另一个是预先定义好的,各种子窗口的各种消息,你可以查一查MSDN,中关于WM_COMMAND的章节.
你的学习路线很对,不懂基本的SDk方式是很难学懂高层的frameworks,不管是MFC,VCL还是其他的.
fansses 2002-06-08
  • 打赏
  • 举报
回复
我的VC出问题,我用C++Builder编译通过,只说了一句警告
[C++ Warning] cpp.cpp(47): W8004 'hBtn' is assigned a value that is never used

rbird 2002-06-08
  • 打赏
  • 举报
回复
谢谢!你可以把我的源代码复制到VC里运行看看有没有问题。
fansses 2002-06-08
  • 打赏
  • 举报
回复
我帮你Up
rbird 2002-06-08
  • 打赏
  • 举报
回复
这么简单的问题没有人回答啊,怎么回事啊...................
rbird 2002-06-08
  • 打赏
  • 举报
回复
是啊,这全部是用API建立的。我就是想深入了解Windows编程的核心,才决定什么都用写的。不用VC的MFC。
fansses 2002-06-08
  • 打赏
  • 举报
回复
这是什么?SDK?我是菜鸟,第一次看到手工C++写按扭的,请原谅我的无知,,,这是SDK?还是什么?谢谢
rbird 2002-06-08
  • 打赏
  • 举报
回复
怎么这里这样冷清呢?
rbird 2002-06-08
  • 打赏
  • 举报
回复
该怎么做呢??
不可能直接这样加吧。该怎样加呢?

LRESULT CALLBACK WinProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)
{
case wm_command:
{
...
}
}
ttzzgg_80713 2002-06-08
  • 打赏
  • 举报
回复
你的wm_command呢
rbird 2002-06-08
  • 打赏
  • 举报
回复
我就是这样建的啊。
hBtn = CreateWindow( "BUTTON", "Push Button",WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 50, 50, 100, 32,hwnd,NULL,hInst, NULL );

主要是在
LRESULT CALLBACK WinProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)
函数中怎样接收消息呢?
yzfhappy 2002-06-08
  • 打赏
  • 举报
回复
在C++编程中,按钮也是窗口,所以它也有消息处理函数,你用WINDOW API 的建立按钮函数(名字我记不清了),它的最后一个参数名就是按钮的消息处理函数名。函数的具体实现和WINPROC函数差不多。

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧