C++Windows编程问题,在一个窗口中怎么接收按钮被点击的消息?

比如在这个程序中要怎么改?//Button.cpp:Definestheentrypointfortheapplication.//#include"stdafx.h"/... 比如在这个程序中要怎么改?
// Button.cpp : Defines the entry point for the application.
//
#include "stdafx.h"
//
LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wp,LPARAM lp);
//
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
// TODO: Place code here.
MSG msg;
HWND hwnd;
char WindowName[]={"This Window\0"};
WNDCLASS wobj;
wobj.style=0;
wobj.lpfnWndProc=WndProc;
wobj.lpszClassName=WindowName;
wobj.lpszMenuName=NULL;
wobj.hIcon=NULL;
wobj.hCursor=LoadCursor(NULL,IDC_ARROW);
wobj.hInstance=hInstance;
wobj.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH);
wobj.cbClsExtra=0;
wobj.cbWndExtra=0;
RegisterClass(&wobj);
hwnd=CreateWindow(WindowName,WindowName,WS_OVERLAPPEDWINDOW|WS_VSCROLL|WS_HSCROLL|WS_SIZEBOX,150,50,200,300,NULL,NULL,hInstance,NULL);
ShowWindow(hwnd,nCmdShow);
UpdateWindow(hwnd);
while(GetMessage(&msg,hwnd,0,0)>0)
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
DeleteObject(hwnd);
return 0;
}

#include"stdafx.h"
LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wp,LPARAM lp)
{
HDC hdc;
PAINTSTRUCT ps;
switch(message)
{
case WM_CREATE:CreateWindow("Button","按钮",WS_VISIBLE|WS_CHILD,10,10,100,120,hwnd,0,0,0);break;
case WM_PAINT:break;
case WM_DESTROY:PostQuitMessage(0);return 0;
default:break;
}
return DefWindowProc(hwnd,message,wp,lp);
}
我想在按钮被点击后输出信息
展开
 我来答
我已经匿名了
推荐于2017-09-12 · TA获得超过816个赞
知道小有建树答主
回答量:478
采纳率:0%
帮助的人:247万
展开全部

首先要给按钮一个ID,然后在create的时候保存它的句柄(static HWND)。在WM_COMMAND消息里写响应函数,用switch进行选择。如下代码:

#define BUTTON_ID  10011            //按钮ID
LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wp,LPARAM lp)
{
HDC hdc;
PAINTSTRUCT ps;
static HWND btnWnd;
static bool flag=false;
switch(message)
{
case WM_CREATE:btnWnd =CreateWindow("Button","按钮",WS_VISIBLE|WS_CHILD,
10,10,150,120,hwnd,(HMENU)BUTTON_ID,0,0);break; //倒数第3个为按钮子窗口ID
case WM_PAINT:break;
case WM_COMMAND: //按钮消息WM_COMMAND来处理
switch(LOWORD(wp)) //wParam的低字节为点击的按钮的ID
{ //下面随便写点什么啦!
case BUTTON_ID:
//SetWindowText(btnWnd,"再点我试试?");
if(flag==true)
{
SendMessage(btnWnd,WM_SETTEXT,0, LPARAM("干嘛点我?"));
}
else
{
SendMessage(btnWnd,WM_SETTEXT,0, LPARAM("再点试试?"));
//SetWindowText(btnWnd,(LPCSTR)"点点");
}
flag = !flag;
//MessageBox(hwnd,"你点我干什么?", "点我啦!",MB_OK);
break;
default:break;
}
break;
case WM_DESTROY:PostQuitMessage(0);return 0;
default:break;
}
return DefWindowProc(hwnd,message,wp,lp);
}
追问

非常感谢!但还有几个问题要问你。

1、那个问题我已经搞懂了,但是我还不知道什么是ID

2、如果我想要做一个类似这样的程序

就是要有那个框,要怎么做?

3、你看有的软件的按钮很好看,比如

是怎么搞的?

4、怎么把窗口的背景搞成一张图片,还可以随时修改?

 

如果不想回答就也说一声,我也给你最佳答案

追答

1.ID就是一个数字编号,作为控件的唯一性标识。通常作为符号常量,定义在resource.h中。

但是菜单项可以和工具栏按钮、快捷键共享ID,执行同样的消息响应代码。

2. 要有那个框,可以在创建控件窗口时通过设置窗口的style来达到目的。具体我也不记得了,可以用对话框设计器来试,满意后保存,在 XXX.RC文件中找到需要的控件样式,然后在CreateWindow或CreateWindowEx中设置样式。

 

后面的3、4可以通过按钮背景贴图、窗口背景贴图实现。涉及的内容也比较多,具体可以另开帖子了。另外也可以先上度娘搜一下,理解原理之后再借鉴下。好多代码都是MFC的,可以转成Win32 的代码。

 

附件是我写的Win32的时钟代码,单击可换背景,右键可设置时间。注意绘图全部在WM_PAINT中实现,首先用LoadImage载入位图,然后采用内存绘图机制,把图画好后再用BitBlt拷贝的屏幕上。

 

金色潜鸟
推荐于2017-10-07 · TA获得超过3.2万个赞
知道大有可为答主
回答量:1.3万
采纳率:89%
帮助的人:5709万
展开全部
用 MFC 写程序比较简单。
在 Doc-View 结构程序里,MESSAGE_MAP 部分 定义 响应表:
--------
BEGIN_MESSAGE_MAP(CXXXView, CScrollView)
// 写上 事件/消息 和 响应函数 表,例如:
ON_COMMAND(ID_COLOR_TEXT, OnColorText)
ON_COMMAND(ID_COLOR_BK, OnColorBk)
END_MESSAGE_MAP()
---------
ID_COLOR_TEXT 是你的资源里的 按钮 定义的消息
OnColorText 是 响应函数名。
---------
跑程序时,会自动检查窗口消息,并调响应函数处理。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
郝在益
2013-05-16 · TA获得超过2079个赞
知道小有建树答主
回答量:1496
采纳率:54%
帮助的人:631万
展开全部
switch(message)
{
case WM_CREATE:CreateWindow("Button","按钮",WS_VISIBLE|WS_CHILD,10,10,100,120,hwnd,0,0,0);break;
case WM_PAINT:break;
case WM_DESTROY:PostQuitMessage(0);return 0;
default:break;
}
在这个switch里添加,按键消息也是数值,你可以查询一下就知道了。
追问
是哪个数值?
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式