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);
}
我想在按钮被点击后输出信息 展开
// 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);
}
我想在按钮被点击后输出信息 展开
展开全部
首先要给按钮一个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就是一个数字编号,作为控件的唯一性标识。通常作为符号常量,定义在resource.h中。
但是菜单项可以和工具栏按钮、快捷键共享ID,执行同样的消息响应代码。
2. 要有那个框,可以在创建控件窗口时通过设置窗口的style来达到目的。具体我也不记得了,可以用对话框设计器来试,满意后保存,在 XXX.RC文件中找到需要的控件样式,然后在CreateWindow或CreateWindowEx中设置样式。
后面的3、4可以通过按钮背景贴图、窗口背景贴图实现。涉及的内容也比较多,具体可以另开帖子了。另外也可以先上度娘搜一下,理解原理之后再借鉴下。好多代码都是MFC的,可以转成Win32 的代码。
附件是我写的Win32的时钟代码,单击可换背景,右键可设置时间。注意绘图全部在WM_PAINT中实现,首先用LoadImage载入位图,然后采用内存绘图机制,把图画好后再用BitBlt拷贝的屏幕上。
展开全部
用 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 是 响应函数名。
---------
跑程序时,会自动检查窗口消息,并调响应函数处理。
在 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 是 响应函数名。
---------
跑程序时,会自动检查窗口消息,并调响应函数处理。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
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里添加,按键消息也是数值,你可以查询一下就知道了。
{
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里添加,按键消息也是数值,你可以查询一下就知道了。
追问
是哪个数值?
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询