各位大侠:我用SDK写了一个对话框 也就是程序就是个对话框 该程序可以运行 但是消息处理函数WndProc 不起作用(感觉是没有调用该函数),此程序是在修改得来的,原程序是通过菜单弹出一个对话框,现在我就修改了创建方式,直接 CreateDialog(),对话框在rc里面用VC做的。请高手指点下。
#include <windows.h>
#include "resource.h"LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM) ;
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR szCmdLine, int iCmdShow)
{
static TCHAR szAppName[] = TEXT ("IDR_MENU1") ;
MSG msg ;
HWND hwnd ;
WNDCLASS wndclass ;
// HMENU hMenu ;
wndclass.style = CS_HREDRAW | CS_VREDRAW ;
wndclass.lpfnWndProc = WndProc;
wndclass.cbClsExtra = 0 ;
wndclass.cbWndExtra = 0 ;
wndclass.hInstance = hInstance ;
wndclass.hIcon = LoadIcon (hInstance, szAppName) ;
wndclass.hCursor = LoadCursor (hInstance,IDC_HELP) ;
wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
wndclass.lpszMenuName = szAppName ;
wndclass.lpszClassName = szAppName ;
if (!RegisterClass (&wndclass))
{
MessageBox (NULL, TEXT ("This program requires Windows NT!"),
szAppName, MB_ICONERROR) ;
return 0 ;
}
hwnd = CreateDialog(hInstance, MAKEINTRESOURCE(ABOUTBOX), 0,NULL) ;
// hMenu = LoadMenu (hInstance, MAKEINTRESOURCE (IDR_MENU1)) ;
// hwnd = CreateWindow ( szAppName, TEXT ("About Box Demo Program"),
// WS_OVERLAPPEDWINDOW,
// CW_USEDEFAULT, CW_USEDEFAULT,
// CW_USEDEFAULT, CW_USEDEFAULT,
// NULL, hMenu, hInstance, NULL) ;
ShowWindow (hwnd, iCmdShow) ;
// UpdateWindow (hwnd) ;
while (GetMessage (&msg, NULL, 0, 0))
{
//MessageBox(hwnd,"aa","ddd",0);
TranslateMessage (&msg) ;
DispatchMessage (&msg) ;
//MessageBox(hwnd,"aa","ddd",0);
}
//return msg.wParam ;
return 0;
}LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
//MessageBox(hwnd,"aa","ddd",0);
TCHAR szBuffer[20] ; int nu;
switch (message)
{
case WM_INITDIALOG :
//MessageBox(hDlg,"aa","bb",0);
SetWindowText (hwnd, TEXT ("Dialog Box Caption")) ;
return TRUE ;
case WM_COMMAND :
switch (LOWORD (wParam))
{
case IDOK :
EndDialog(hwnd, 0);
return TRUE;
case IDCANCEL :
EndDialog (hwnd, 0) ;
return TRUE ;
case IDC_BLUE:
wsprintf (szBuffer, TEXT ("%d"), IDC_BLUE) ;
SetDlgItemText (hwnd, IDC_EDIT1, szBuffer) ;
break;
case IDC_YELLOW:
nu=IDC_YELLOW;
break;
case IDC_RED:
nu=IDC_RED;
break;
case IDC_BLACK:
nu=IDC_BLACK;
break;
case IDC_CHECK1:
nu=IDC_CHECK1;
break;
case IDC_CHECK2:
nu=IDC_CHECK2;
break;
}
case WM_DESTROY :
PostQuitMessage (0) ;
return 0 ;
}
return DefWindowProc (hwnd, message, wParam, lParam) ;
}
/////////////////////////////////////////////////////////////////////////////////////////
原程序下面
/////////////////////////////////////////////////////////////////////////////////////////
#include <windows.h>
#include "resource.h"LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
BOOL CALLBACK AboutDlgProc (HWND, UINT, WPARAM, LPARAM) ;int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR szCmdLine, int iCmdShow)
{
static TCHAR szAppName[] = TEXT ("IDR_MENU1") ;
MSG msg ;
HWND hwnd ;
WNDCLASS wndclass ;
HMENU hMenu ;
wndclass.style = CS_HREDRAW | CS_VREDRAW ;
wndclass.lpfnWndProc = WndProc ;
wndclass.cbClsExtra = 0 ;
wndclass.cbWndExtra = 0 ;
wndclass.hInstance = hInstance ;
wndclass.hIcon = LoadIcon (hInstance, szAppName) ;
wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ;
wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
wndclass.lpszMenuName = szAppName ;
wndclass.lpszClassName = szAppName ;
if (!RegisterClass (&wndclass))
{
MessageBox (NULL, TEXT ("This program requires Windows NT!"),
szAppName, MB_ICONERROR) ;
return 0 ;
}
hMenu = LoadMenu (hInstance, MAKEINTRESOURCE (IDR_MENU1)) ;
//hMenu = LoadDialog (hInstance, MAKEINTRESOURCE (IDR_MENU1)) ;
hwnd = CreateWindow ( szAppName, TEXT ("About Box Demo Program"),
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT,
CW_USEDEFAULT, CW_USEDEFAULT,
NULL, hMenu, hInstance, NULL) ;
ShowWindow (hwnd, iCmdShow) ;
UpdateWindow (hwnd) ;
while (GetMessage (&msg, NULL, 0, 0))
{
TranslateMessage (&msg) ;
DispatchMessage (&msg) ;
}
return msg.wParam ;
}LRESULT CALLBACK WndProc ( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
static HINSTANCE hInstance ;
switch (message)
{
case WM_CREATE :
hInstance = ((LPCREATESTRUCT) lParam)->hInstance ;
return 0 ;
case WM_COMMAND :
switch (LOWORD (wParam))
{
case IDM_APP_ABOUT :
DialogBox (hInstance, MAKEINTRESOURCE (ABOUTBOX), hwnd, AboutDlgProc) ;
//MessageBox(hwnd,"aa","bb",0);
break ;
}
return 0 ;
case WM_DESTROY :
PostQuitMessage (0) ;
return 0 ;
}
return DefWindowProc (hwnd, message, wParam, lParam) ;
}BOOL CALLBACK AboutDlgProc (HWND hDlg, UINT message,WPARAM wParam, LPARAM lParam)
{
TCHAR szBuffer[20] ;
int nu;
switch (message)
{
case WM_INITDIALOG :
//MessageBox(hDlg,"aa","bb",0);
SetWindowText (hDlg, TEXT ("Dialog Box Caption")) ;
return TRUE ;
case WM_COMMAND :
switch (LOWORD (wParam))
{
case IDOK :
//MessageBox(hDlg,"success","success",0);
return TRUE;
case IDCANCEL :
EndDialog (hDlg, 0) ;
return TRUE ;
case IDC_BLUE:
wsprintf (szBuffer, TEXT ("%d"), IDC_BLUE) ;
SetDlgItemText (hDlg, IDC_EDIT1, szBuffer) ;
break;
case IDC_YELLOW:
nu=IDC_YELLOW;
break;
case IDC_RED:
nu=IDC_RED;
break;
case IDC_BLACK:
nu=IDC_BLACK;
break;
case IDC_CHECK1:
nu=IDC_CHECK1;
break;
case IDC_CHECK2:
nu=IDC_CHECK2;
break;
}
break ;
}
return FALSE ;
}
#include <windows.h>
#include "resource.h"LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM) ;
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR szCmdLine, int iCmdShow)
{
static TCHAR szAppName[] = TEXT ("IDR_MENU1") ;
MSG msg ;
HWND hwnd ;
WNDCLASS wndclass ;
// HMENU hMenu ;
wndclass.style = CS_HREDRAW | CS_VREDRAW ;
wndclass.lpfnWndProc = WndProc;
wndclass.cbClsExtra = 0 ;
wndclass.cbWndExtra = 0 ;
wndclass.hInstance = hInstance ;
wndclass.hIcon = LoadIcon (hInstance, szAppName) ;
wndclass.hCursor = LoadCursor (hInstance,IDC_HELP) ;
wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
wndclass.lpszMenuName = szAppName ;
wndclass.lpszClassName = szAppName ;
if (!RegisterClass (&wndclass))
{
MessageBox (NULL, TEXT ("This program requires Windows NT!"),
szAppName, MB_ICONERROR) ;
return 0 ;
}
hwnd = CreateDialog(hInstance, MAKEINTRESOURCE(ABOUTBOX), 0,NULL) ;
// hMenu = LoadMenu (hInstance, MAKEINTRESOURCE (IDR_MENU1)) ;
// hwnd = CreateWindow ( szAppName, TEXT ("About Box Demo Program"),
// WS_OVERLAPPEDWINDOW,
// CW_USEDEFAULT, CW_USEDEFAULT,
// CW_USEDEFAULT, CW_USEDEFAULT,
// NULL, hMenu, hInstance, NULL) ;
ShowWindow (hwnd, iCmdShow) ;
// UpdateWindow (hwnd) ;
while (GetMessage (&msg, NULL, 0, 0))
{
//MessageBox(hwnd,"aa","ddd",0);
TranslateMessage (&msg) ;
DispatchMessage (&msg) ;
//MessageBox(hwnd,"aa","ddd",0);
}
//return msg.wParam ;
return 0;
}LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
//MessageBox(hwnd,"aa","ddd",0);
TCHAR szBuffer[20] ; int nu;
switch (message)
{
case WM_INITDIALOG :
//MessageBox(hDlg,"aa","bb",0);
SetWindowText (hwnd, TEXT ("Dialog Box Caption")) ;
return TRUE ;
case WM_COMMAND :
switch (LOWORD (wParam))
{
case IDOK :
EndDialog(hwnd, 0);
return TRUE;
case IDCANCEL :
EndDialog (hwnd, 0) ;
return TRUE ;
case IDC_BLUE:
wsprintf (szBuffer, TEXT ("%d"), IDC_BLUE) ;
SetDlgItemText (hwnd, IDC_EDIT1, szBuffer) ;
break;
case IDC_YELLOW:
nu=IDC_YELLOW;
break;
case IDC_RED:
nu=IDC_RED;
break;
case IDC_BLACK:
nu=IDC_BLACK;
break;
case IDC_CHECK1:
nu=IDC_CHECK1;
break;
case IDC_CHECK2:
nu=IDC_CHECK2;
break;
}
case WM_DESTROY :
PostQuitMessage (0) ;
return 0 ;
}
return DefWindowProc (hwnd, message, wParam, lParam) ;
}
/////////////////////////////////////////////////////////////////////////////////////////
原程序下面
/////////////////////////////////////////////////////////////////////////////////////////
#include <windows.h>
#include "resource.h"LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
BOOL CALLBACK AboutDlgProc (HWND, UINT, WPARAM, LPARAM) ;int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR szCmdLine, int iCmdShow)
{
static TCHAR szAppName[] = TEXT ("IDR_MENU1") ;
MSG msg ;
HWND hwnd ;
WNDCLASS wndclass ;
HMENU hMenu ;
wndclass.style = CS_HREDRAW | CS_VREDRAW ;
wndclass.lpfnWndProc = WndProc ;
wndclass.cbClsExtra = 0 ;
wndclass.cbWndExtra = 0 ;
wndclass.hInstance = hInstance ;
wndclass.hIcon = LoadIcon (hInstance, szAppName) ;
wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ;
wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
wndclass.lpszMenuName = szAppName ;
wndclass.lpszClassName = szAppName ;
if (!RegisterClass (&wndclass))
{
MessageBox (NULL, TEXT ("This program requires Windows NT!"),
szAppName, MB_ICONERROR) ;
return 0 ;
}
hMenu = LoadMenu (hInstance, MAKEINTRESOURCE (IDR_MENU1)) ;
//hMenu = LoadDialog (hInstance, MAKEINTRESOURCE (IDR_MENU1)) ;
hwnd = CreateWindow ( szAppName, TEXT ("About Box Demo Program"),
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT,
CW_USEDEFAULT, CW_USEDEFAULT,
NULL, hMenu, hInstance, NULL) ;
ShowWindow (hwnd, iCmdShow) ;
UpdateWindow (hwnd) ;
while (GetMessage (&msg, NULL, 0, 0))
{
TranslateMessage (&msg) ;
DispatchMessage (&msg) ;
}
return msg.wParam ;
}LRESULT CALLBACK WndProc ( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
static HINSTANCE hInstance ;
switch (message)
{
case WM_CREATE :
hInstance = ((LPCREATESTRUCT) lParam)->hInstance ;
return 0 ;
case WM_COMMAND :
switch (LOWORD (wParam))
{
case IDM_APP_ABOUT :
DialogBox (hInstance, MAKEINTRESOURCE (ABOUTBOX), hwnd, AboutDlgProc) ;
//MessageBox(hwnd,"aa","bb",0);
break ;
}
return 0 ;
case WM_DESTROY :
PostQuitMessage (0) ;
return 0 ;
}
return DefWindowProc (hwnd, message, wParam, lParam) ;
}BOOL CALLBACK AboutDlgProc (HWND hDlg, UINT message,WPARAM wParam, LPARAM lParam)
{
TCHAR szBuffer[20] ;
int nu;
switch (message)
{
case WM_INITDIALOG :
//MessageBox(hDlg,"aa","bb",0);
SetWindowText (hDlg, TEXT ("Dialog Box Caption")) ;
return TRUE ;
case WM_COMMAND :
switch (LOWORD (wParam))
{
case IDOK :
//MessageBox(hDlg,"success","success",0);
return TRUE;
case IDCANCEL :
EndDialog (hDlg, 0) ;
return TRUE ;
case IDC_BLUE:
wsprintf (szBuffer, TEXT ("%d"), IDC_BLUE) ;
SetDlgItemText (hDlg, IDC_EDIT1, szBuffer) ;
break;
case IDC_YELLOW:
nu=IDC_YELLOW;
break;
case IDC_RED:
nu=IDC_RED;
break;
case IDC_BLACK:
nu=IDC_BLACK;
break;
case IDC_CHECK1:
nu=IDC_CHECK1;
break;
case IDC_CHECK2:
nu=IDC_CHECK2;
break;
}
break ;
}
return FALSE ;
}
解决方案 »
- CreateProcess 错误代码2
- 使用Ado链接ACCESS只能使用OLEDB3.51,我想使用4.0怎么办?(有答案了再加分,至少50)
- 南京 工资1200,有多少人愿意做开发?有同样“遭遇”的过来报个到
- 完成端口(IOCP)-如何在已建立的socket上同时进行接收和发送数据请求, 以前以就这个问题进行过讨论,但又有新问题!
- ADO,各位大侠指点我一条明路
- 怎么判断另一个exe程序是否已经运行?
- 关于安装的问题,在线!!!!!
- 奇怪!看看下面这个COM问题!
- 我这样做有错误吗?别逼我
- 请问atl对话框上加的按钮是MFC的CButton类吗?
- 很弱的问题:基于FormView的单文档视图要拆分客户区怎么办啊?
- 菜鸟请教一个VS。NET和VS6。0的区别问题
ShowWindow (hDlgModeless,SW_SHOW);
与模态对话框和消息框的消息不同,非模态对话框的消息要经过程序式的消息队列。要将这些消息传送给对话框窗口消息处理程序,则必须改变消息队列。方法如下:当您使用CreateDialog建立非模态对话框时,应该将从呼叫中传回的对话框句柄储存在一个整体变量(如hDlgModeless)中,并将消息循环改变为:
while (GetMessage(&msg,NULL,0,0))
{
if (hDlgModeless == 0 || !IsDialogMessage (hDlgModeless, &msg))
{
TranslateMessage (&msg);
DispatchMessage (&msg);
}
}
如果用int 型存createDialog()的返回值就会出现错误,是不可以的 因为类型都不一样,我改成 HWND 类型 程序可以运行 但是还是不能接受消息 很郁闷
我就是在看 侯捷 老师的那本WINDOWS程序设计的时候有点迷茫 一个程序 我想变通下 就不正常了。
你在createdialog的时候在最后一个参数里定义回调函数啊
你把你对话框的回调函放到回调函数里调当然不行啦
你在createdialog的时候应该改成这样:
hwnd = CreateDialog(hInstance, MAKEINTRESOURCE(ABOUTBOX), 0,WndProc) ;
然后再ShowWindow(hwnd, SW_SHOW);
就ok了~
PS:按照命名的一般习惯 WndProc应该命名主回调函数
你试试看
这个我弄了的 有错误:
--------------------Configuration: paper - Win32 Debug--------------------
Compiling...
paper.cpp
C:\Documents and Settings\paper\paper\paper\paper.cpp(35) : error C2664: 'CreateDialogParamA' : cannot convert parameter 4 from 'long (struct HWND__ *,unsigned int,unsigned int,long)' to 'int (__stdcall *)(struct HWND__ *,unsigned int,unsi
gned int,long)'
None of the functions with this name in scope match the target type
Error executing cl.exe.paper.exe - 1 error(s), 0 warning(s)
改成 CreateDialog(hInstance, MAKEINTRESOURCE(ABOUTBOX), 0,(DLGPROC)WndProc) ;
这样没问题了,还有细节问题CreateDialog创建的对话框要用DestroyWindow销毁,不要用EndDialog,除了这一点,其他的和模态对话框没什么两样,还有上面说的
while (GetMessage(&msg,NULL,0,0))
{
if (hDlgModeless == 0 || !IsDialogMessage (hDlgModeless, &msg))
{
TranslateMessage (&msg);
DispatchMessage (&msg);
}
}
也要注意
case WM_COMMAND :后面应该加一个break,否则,受到任何WM_COMMAND消息都会执行WM_COMMAND下面那个语句块。
case WM_DESTROY :
PostQuitMessage (0) ;
return 0 ;
程序就直接退出了。
:)