对话框的系统按钮 点击对话框的系统菜单(如最小化 关闭按钮),没有任何反应是怎么回事啊(一点反应也没有 就包括正常按钮在点击时外观的变化也没有) 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 对话框有没有处理 WM_SYSCOMMAND 消息? 看看在 OnSysCommand(UINT nID, LPARAM lParam) 函数中,写了什么代码及WindowProc(UINT message, WPARAM wParam, LPARAM lParam)这个函数也看看 一般无需处理 WM_SYSCOMMAND 消息。 下面是代码#include <windows.h>#include "resource.h"BOOL CALLBACK DlgProc (HWND, UINT, WPARAM, LPARAM) ;int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow){ TCHAR szAppName[]=TEXT("dialog"); if(-1==DialogBox(hInstance,szAppName,NULL,DlgProc)) { MessageBox(NULL,TEXT("Dialog Create Error"),TEXT("Error"),MB_OK); return 0; } return 0;}BOOL CALLBACK DlgProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam){ switch(message) { case WM_INITDIALOG: //MessageBox(NULL,TEXT("SetWindowLong"),TEXT(""),MB_OK); SetWindowLong(hwnd,GWL_STYLE,GetWindowLong(hwnd,GWL_STYLE) | WS_MINIMIZEBOX); break; case WM_SYSCOMMAND: switch (LOWORD (wParam)) { case SC_CLOSE: EndDialog (hwnd, 0) ; return TRUE; case SC_MINIMIZE: MessageBox(NULL,TEXT("最小化"),TEXT(""),MB_OK); return TRUE; } } return DefWindowProc(hwnd,message,wParam,lParam);} case WM_SYSCOMMAND: switch (wParam) .... wParam 的高字节好像为空 这样应该也可以吧 你说的我试了 结果一样 1)要给DialogBox一个对话框资源。2)回调函数最后不使用DefWindowProc,改成 return FALSE;即可。#include <windows.h>#include "resource.h"BOOL CALLBACK DlgProc (HWND, UINT, WPARAM, LPARAM) ;int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow){ //TCHAR szAppName[]=TEXT("dialog"); if(-1==DialogBox(hInstance,(LPCTSTR)(IDD_ABOUTBOX),NULL,(DLGPROC)DlgProc))//IDD_ABOUTBOX是个对话框资源ID { MessageBox(NULL,TEXT("Dialog Create Error"),TEXT("Error"),MB_OK); return -1; } return 0;}BOOL CALLBACK DlgProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam){ switch(message) { case WM_INITDIALOG: //MessageBox(NULL,TEXT("SetWindowLong"),TEXT(""),MB_OK); SetWindowLong(hwnd,GWL_STYLE,GetWindowLong(hwnd,GWL_STYLE) | WS_MINIMIZEBOX); break; case WM_SYSCOMMAND: switch (LOWORD (wParam)) { case SC_CLOSE: EndDialog (hwnd, 0) ; return TRUE; case SC_MINIMIZE: MessageBox(NULL,TEXT("最小化"),TEXT(""),MB_OK); return TRUE; } } return FALSE;} 另外WM_INITDIALOG部分改成: case WM_INITDIALOG: //MessageBox(NULL,TEXT("SetWindowLong"),TEXT(""),MB_OK); SetWindowLong(hwnd,GWL_STYLE,GetWindowLong(hwnd,GWL_STYLE) | WS_MINIMIZEBOX); return TRUE; 顶,楼上几位需要处理WM_SYSCOMMAND消息 感谢 把最后的改成return FALSE 就好用了 难道对话框不可以使用默认的消息处理程序么? 最后的return FALSE;表示自己没有处理,交给其他窗口处理(如父窗口)。自己可以看看msdn中对DialogBox的回调函数的说明。 新手,SOS,全局函数怎么给局部函数传消息? boost一个serialization静态库10m? 请教一个问题! 有关编辑框传递参数的问题 LNK2005问题 多个lib文件中函数重定义问题 200分!如何修改IE的打印对话框的打印份数等属性 关于CTab 再问GetSafeHwnd() ? 问题,我做过在多个线程下共享一个队列,但是我想做到多个进程也就是多个程序共享一个进程,怎么做?可以实现吗?欢迎大家讨论!:) 一个关于ListView 的问题,一定给分 MFC难学啊,框架类、视类、文档类?它们什么关系。 _stdcall 是什么样的一种调用
#include <windows.h>
#include "resource.h"
BOOL CALLBACK DlgProc (HWND, UINT, WPARAM, LPARAM) ;int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
{
TCHAR szAppName[]=TEXT("dialog");
if(-1==DialogBox(hInstance,szAppName,NULL,DlgProc))
{
MessageBox(NULL,TEXT("Dialog Create Error"),TEXT("Error"),MB_OK);
return 0;
}
return 0;
}BOOL CALLBACK DlgProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch(message)
{
case WM_INITDIALOG:
//MessageBox(NULL,TEXT("SetWindowLong"),TEXT(""),MB_OK);
SetWindowLong(hwnd,GWL_STYLE,GetWindowLong(hwnd,GWL_STYLE) | WS_MINIMIZEBOX);
break;
case WM_SYSCOMMAND:
switch (LOWORD (wParam))
{
case SC_CLOSE:
EndDialog (hwnd, 0) ;
return TRUE;
case SC_MINIMIZE:
MessageBox(NULL,TEXT("最小化"),TEXT(""),MB_OK);
return TRUE;
}
}
return DefWindowProc(hwnd,message,wParam,lParam);
}
switch (wParam)
....
2)回调函数最后不使用DefWindowProc,改成 return FALSE;即可。
#include <windows.h>
#include "resource.h"BOOL CALLBACK DlgProc (HWND, UINT, WPARAM, LPARAM) ;int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
{
//TCHAR szAppName[]=TEXT("dialog");
if(-1==DialogBox(hInstance,(LPCTSTR)(IDD_ABOUTBOX),NULL,(DLGPROC)DlgProc))//IDD_ABOUTBOX是个对话框资源ID
{
MessageBox(NULL,TEXT("Dialog Create Error"),TEXT("Error"),MB_OK);
return -1;
}
return 0;
}BOOL CALLBACK DlgProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch(message)
{
case WM_INITDIALOG:
//MessageBox(NULL,TEXT("SetWindowLong"),TEXT(""),MB_OK);
SetWindowLong(hwnd,GWL_STYLE,GetWindowLong(hwnd,GWL_STYLE) | WS_MINIMIZEBOX);
break;
case WM_SYSCOMMAND:
switch (LOWORD (wParam))
{
case SC_CLOSE:
EndDialog (hwnd, 0) ;
return TRUE;
case SC_MINIMIZE:
MessageBox(NULL,TEXT("最小化"),TEXT(""),MB_OK);
return TRUE;
}
}
return FALSE;
}
case WM_INITDIALOG:
//MessageBox(NULL,TEXT("SetWindowLong"),TEXT(""),MB_OK);
SetWindowLong(hwnd,GWL_STYLE,GetWindowLong(hwnd,GWL_STYLE) | WS_MINIMIZEBOX);
return TRUE;
需要处理
WM_SYSCOMMAND
消息
难道对话框不可以使用默认的消息处理程序么?
自己可以看看msdn中对
DialogBox的回调函数的说明。