代码如下:#include"windows.h"
#include"stdio.h"LRESULT CALLBACK MyProc( HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam
);
int WINAPI WinMain( HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
WNDCLASS a;
a.cbClsExtra=0;
a.cbWndExtra=0;
a.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH);
a.hCursor=LoadCursor(NULL,IDC_CROSS);
a.hIcon=LoadIcon(NULL,IDI_APPLICATION);
a.hInstance=hInstance;
a.lpfnWndProc=MyProc;
a.lpszClassName="aaa";
a.lpszMenuName=NULL;
a.style=CS_VREDRAW|CS_HREDRAW; RegisterClass(&a); HWND hwnd;
hwnd=CreateWindow("aaa","ben zhu",WS_OVERLAPPEDWINDOW ,
0,0,600,600,NULL,NULL,hInstance,NULL); ShowWindow(hwnd,SW_SHOW);
UpdateWindow(hwnd); MSG msg;
while (GetMessage(&msg, hwnd, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
} return msg.wParam;
}LRESULT CALLBACK MyProc(
HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam
)
{ HDC hdc;
PAINTSTRUCT ps;
switch(uMsg)
{
case WM_PAINT:
BeginPaint(hwnd, &ps);
SetTextColor(hdc,RGB(255,0,0));
TextOut(hdc,0,0,"You are my girlfrend!",strlen("You are my girlfrend!"));
EndPaint(hwnd, &ps);
break;
case WM_CHAR:
char a[100];
memset(a,0,100);
sprintf(a,"the char is %d",wParam);
MessageBox(hwnd,a,"ben zhu",MB_OK);
break;
case WM_LBUTTONDOWN:
MessageBox(hwnd,"hello","aaa",MB_OK);
HDC hDC;
hDC=GetDC(hwnd);
SetTextColor(hdc,RGB(255,0,0));
TextOut(hdc,20,30,"You are lovely!",strlen("You are lovely!"));
ReleaseDC(hwnd,hDC);
break;
case WM_CLOSE:
DestroyWindow( hwnd );
SendMessage(hwnd, WM_DESTROY,0,0);
break;
case WM_DESTROY:
if(IDYES==MessageBox(hwnd,"是否要退出","aaa", MB_YESNO|MB_DEFBUTTON2))
PostQuitMessage(0);//这有问题吗?
break;
default:
return DefWindowProc(hwnd,uMsg,wParam,lParam); } return 0;
}
#include"stdio.h"LRESULT CALLBACK MyProc( HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam
);
int WINAPI WinMain( HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
WNDCLASS a;
a.cbClsExtra=0;
a.cbWndExtra=0;
a.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH);
a.hCursor=LoadCursor(NULL,IDC_CROSS);
a.hIcon=LoadIcon(NULL,IDI_APPLICATION);
a.hInstance=hInstance;
a.lpfnWndProc=MyProc;
a.lpszClassName="aaa";
a.lpszMenuName=NULL;
a.style=CS_VREDRAW|CS_HREDRAW; RegisterClass(&a); HWND hwnd;
hwnd=CreateWindow("aaa","ben zhu",WS_OVERLAPPEDWINDOW ,
0,0,600,600,NULL,NULL,hInstance,NULL); ShowWindow(hwnd,SW_SHOW);
UpdateWindow(hwnd); MSG msg;
while (GetMessage(&msg, hwnd, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
} return msg.wParam;
}LRESULT CALLBACK MyProc(
HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam
)
{ HDC hdc;
PAINTSTRUCT ps;
switch(uMsg)
{
case WM_PAINT:
BeginPaint(hwnd, &ps);
SetTextColor(hdc,RGB(255,0,0));
TextOut(hdc,0,0,"You are my girlfrend!",strlen("You are my girlfrend!"));
EndPaint(hwnd, &ps);
break;
case WM_CHAR:
char a[100];
memset(a,0,100);
sprintf(a,"the char is %d",wParam);
MessageBox(hwnd,a,"ben zhu",MB_OK);
break;
case WM_LBUTTONDOWN:
MessageBox(hwnd,"hello","aaa",MB_OK);
HDC hDC;
hDC=GetDC(hwnd);
SetTextColor(hdc,RGB(255,0,0));
TextOut(hdc,20,30,"You are lovely!",strlen("You are lovely!"));
ReleaseDC(hwnd,hDC);
break;
case WM_CLOSE:
DestroyWindow( hwnd );
SendMessage(hwnd, WM_DESTROY,0,0);
break;
case WM_DESTROY:
if(IDYES==MessageBox(hwnd,"是否要退出","aaa", MB_YESNO|MB_DEFBUTTON2))
PostQuitMessage(0);//这有问题吗?
break;
default:
return DefWindowProc(hwnd,uMsg,wParam,lParam); } return 0;
}
解决方案 »
- Windows消息和DLL问题
- 谁有ws2_32.lib这个文件
- Linux下tcp基于socket的编程如何实现端口重用
- 【求教】如何保存画图后的痕迹
- 已得到文件的绝对路径,如何传到函数的参数里?
- 调试为何自动进行汇编调试,不能使用单步等?内详
- 默认的SDI工程,我加了一个CDialog,里面有一个Button,我怎么能通过这个Button添加文本到CRichEditView
- 请教高手,如何用钩子截获拷贝、粘贴等操作消息,怎样能知道这些操作针对哪些文件?
- VC 代码动态修改Table String内的值
- 那位高手能告诉我vc中的rc文件中调用afxres.h是什么意思? afxres.h在工程当中有什么作用?
- network programing for windows author A and J
- vc++ 上 gluBuild2DMipmaps出现异常错误,过程和现象如下 大侠都来帮忙看看啊
PostQuitMessage(0);//这有问题吗?
-------------------
没进去,MessageBox返回1, IDYES在我这是6,所以没执行PostQuitMessage(0)
while (GetMessage(&msg, hwnd, 0, 0)) // -->改为while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
} 另外MessageBox应该放在WM_CLOSE里面,在DestroyWindow( hwnd )之前,否则点否的话,窗口依然会消失,但程序不会退出……
SendMessage(hwnd, WM_DESTROY,0,0);
这2句的意义是一样的,一句就可以了
经典错误,hwnd改为NULL。
两个代码有什么不同呢 第一个不能结束程序 第二个却可以 困惑
http://topic.csdn.net/t/20021115/13/1179420.html#include"windows.h"
#include"stdio.h"
#define _T(x) x
LRESULT CALLBACK MyProc( HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam
);
int WINAPI WinMain( HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
HWND hwnd;
MSG Msg;
WNDCLASS wndclass;
char lpszClassName[]="窗口";
char lpszTitle[]="窗口示例";
wndclass.style=CS_HREDRAW | CS_VREDRAW;
wndclass.lpfnWndProc =MyProc;
wndclass.cbWndExtra=0;
wndclass.cbClsExtra =0;
wndclass.hInstance=hInstance;
wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);
wndclass.hbrBackground = (HBRUSH)(GetStockObject(WHITE_BRUSH));
wndclass.lpszMenuName=NULL;
wndclass.lpszClassName=lpszClassName;
if(!RegisterClass(&wndclass))
{
MessageBeep(0);
return FALSE;
}
hwnd=CreateWindow(lpszClassName,
lpszTitle,
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,
NULL,
hInstance,
NULL);
ShowWindow(hwnd,SW_SHOW);
UpdateWindow(hwnd);
MSG msg;
while (GetMessage(&msg, hwnd, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
} LRESULT CALLBACK MyProc(
HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam
)
{
switch(uMsg)
{
case WM_CLOSE:
MessageBox(NULL,_T("收到WM_CLOSE消息,即将调用 DestroyWindow(hwnd);"),_T("注意了"),MB_OK);
DestroyWindow(hwnd);
break;
case WM_DESTROY:
MessageBox(NULL,_T("已调用过DestroyWindow(hwnd),看不到窗口了吧;"),_T("注意了"),MB_OK);
MessageBox(NULL,_T("以下处理WM_DESTROY"),_T("注意了"),MB_OK);
PostQuitMessage(0);
break;
case WM_SYSCOMMAND:
if((LOWORD(wParam)&0xFFF0)==SC_CLOSE)
{
MessageBox(NULL,_T("你关闭了窗口,即将发送WM_CLOSE消息!"),_T("注意了"),MB_OK);
SendMessage(hwnd,WM_CLOSE,0,0);
}
//不要添加 break,否则不能响应其它WM_SYSCOMMAND消息
default:
return DefWindowProc(hwnd,uMsg,wParam,lParam);
}
return(0);
} #include <Windows.h>
#include <TCHAR.h>
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInst,
LPSTR lpszCmdLine,
int nCmdShow)
{
HWND hwnd;
MSG Msg;
WNDCLASS wndclass;
char lpszClassName[]="窗口";
char lpszTitle[]="窗口示例";
wndclass.style=CS_HREDRAW | CS_VREDRAW;
wndclass.lpfnWndProc =WndProc;
wndclass.cbWndExtra=0;
wndclass.cbClsExtra =0;
wndclass.hInstance=hInstance;
wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);
wndclass.hbrBackground = (HBRUSH)(GetStockObject(WHITE_BRUSH));
wndclass.lpszMenuName=NULL;
wndclass.lpszClassName=lpszClassName;
if(!RegisterClass(&wndclass))
{
MessageBeep(0);
return FALSE;
}
hwnd=CreateWindow(lpszClassName,
lpszTitle,
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,
NULL,
hInstance,
NULL);
ShowWindow(hwnd,nCmdShow);
UpdateWindow(hwnd);
while(1)
{
GetMessage(&Msg,NULL,0,0);
if(Msg.message==WM_QUIT)
{
MessageBox(NULL,_T("收到WM_QUIT,即将跳出消息循环"),_T("注意了"),MB_OK);
break;
}
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}
MessageBox(NULL,_T("已经跳出消息循环,应用程序即将结束!"),_T("注意了"),MB_OK);
return Msg.wParam;
}
LRESULT CALLBACK WndProc(
HWND hwnd,
UINT message,
WPARAM wParam,
LPARAM lParam)
{
switch(message)
{
case WM_CLOSE:
MessageBox(NULL,_T("收到WM_CLOSE消息,即将调用 DestroyWindow(hwnd);"),_T("注意了"),MB_OK);
DestroyWindow(hwnd);
break;
case WM_DESTROY:
MessageBox(NULL,_T("已调用过DestroyWindow(hwnd),看不到窗口了吧;"),_T("注意了"),MB_OK);
MessageBox(NULL,_T("以下处理WM_DESTROY"),_T("注意了"),MB_OK);
PostQuitMessage(0);
break;
case WM_SYSCOMMAND:
if((LOWORD(wParam)&0xFFF0)==SC_CLOSE)
{
MessageBox(NULL,_T("你关闭了窗口,即将发送WM_CLOSE消息!"),_T("注意了"),MB_OK);
SendMessage(hwnd,WM_CLOSE,0,0);
}
//不要添加 break,否则不能响应其它WM_SYSCOMMAND消息
default:
return DefWindowProc(hwnd,message,wParam,lParam);
}
return(0);
}
但是应用程序没退出
我把全部的MessageBox屏蔽掉程序还是没有退出 ,窗口没有了,进程还在
MSDN的解释:
hWnd
Handle to the window whose messages are to be retrieved. One value has a special meaning: Value Meaning
NULL GetMessage retrieves messages for any window that belongs to the calling thread and thread messages posted to the calling thread via PostThreadMessage.