1 我建了个非模态对话框,为什么在主窗口中一点击按钮激活就一闪而过?2 。
while(GetMessage(&Msg,NULL,0,0))
{
if(!IsDialogMessage(hdlg,&Msg))
{
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}
}如果不是对话框消息,那TranslateMessage(&Msg);DispatchMessage(&Msg);还执行吗?不执行其他消息又如何处理?要不是对话框消息而是其他消息仍然可以处理啊, 怎么处理的?
while(GetMessage(&Msg,NULL,0,0))
{
if(!IsDialogMessage(hdlg,&Msg))
{
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}
}如果不是对话框消息,那TranslateMessage(&Msg);DispatchMessage(&Msg);还执行吗?不执行其他消息又如何处理?要不是对话框消息而是其他消息仍然可以处理啊, 怎么处理的?
解决方案 »
- R6002 float point support not loaded 是什么故障?
- 按惯例升星星散分 :)
- Vista下用PreviewHandler预览Word文档,如何只显示第一页?
- 如何在CView中插入滚动条,以方便大量数据的显示
- 变量符号的问题
- 请问如何在 图形界面 工程中 引用 dos界面?
- 关于多线程参数传递问题?
- VC++在WinSNMP下进行网管开发的一些问题!高手请进!
- 将int型转化为字符型用什么函数?
- 巨简单问题。我的一个类的static成员变量在link的时候报错。
- 请教智慧的鱼 :编了一个TS流解复用Filter,但是有问题,望高手指点!
- 求助C高手写一个WINDOWS服务程序(原付酬劳)
BOOL CALLBACK DlgProcAdd(HWND hdlg,UINT message,WPARAM wParam,LPARAM lParam)
{
switch(message)
{
case WM_INITDIALOG:
return 1; //初始化对话框
case WM_COMMAND: //处理消息框消息
switch(wParam)
{
case IDOK:
DestroyWindow(hdlg); //关闭对话框
return 1;
}
break;
case WM_CLOSE:
DestroyWindow(hdlg);
return 1;
}
return 0;
}主过程中的触发:
case ID_ADD:
hdlg = CreateDialog(hInst,"Add",hwnd,(DLGPROC)DlgProcAdd);
ShowWindow(hdlg,SW_SHOW);
资源定义:
Add DIALOG 100,100,200,100
STYLE WS_POPUP|WS_CAPTION|WS_SYSMENU|WS_VISIBLE
CAPTION "添加对话框"
FONT 18,"楷体" //定义对话框中的文本字体类型及大小
{
CTEXT "代号:",-1,20,20,30,20
DEFPUSHBUTTON "确定",IDOK,35,30,30,12
}对话框的相关内容如上
ShowWindow(hwndDlg,SW_NORMAL);LRESULT CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_INITDIALOG:
return TRUE; case WM_COMMAND:
if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL) //这样判断
{
EndDialog(hDlg, LOWORD(wParam));
return TRUE;
}
break;
}
return FALSE;
}
另外非模态对话框不是用destroywindow吗?用EndDialog(hDlg, LOWORD(wParam));也行?快崩溃啦!!!!!!!!!!!!!!!
{
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}
}这段话的意思是,如果是对话框消息,由IsDialogMessage处理,否则TranslateMessage(&Msg);
DispatchMessage(&Msg);
2.非模态对话框EndDialog隐藏窗口,destroywindow销毁窗口
{
......
return TRUE;
}
DefWindowProc(hDlg, message, wParam, lParam);
return 1;
或者
case WM_INITDIALOG:
return 0;
试试,这个我也没有把握
这样也不行。to:ForTopLevel(Beahead) ( )
我没有重绘。一触发对话框一闪连整个程序就退出了
hdlg = CreateDialog(hInst,"Add",hwnd,(DLGPROC)
后面的代码有问题,呵呵
hdlg = CreateDialog(hInst,"Add",hwnd,(DLGPROC)DlgProcAdd);
没有问题啊。贴出来换行乱了
-----------------------
#include <windows.h>
//#include "resource.h"
#include "afxres.h"Add DIALOG 50,50,100,50
STYLE WS_POPUP|WS_CAPTION|WS_SYSMENU|WS_VISIBLE|DS_MODALFRAME
CAPTION "添加对话框"
FONT 18,"楷体" //定义对话框中的文本字体类型及大小
begin
CTEXT "代号:",1002,13,10,80,10
// EDITTEXT ID_EDITTEXT1,30,30,30,30
PUSHBUTTON "确定",IDOK,35,30,30,12
endDelete DIALOG 100,100,200,100
STYLE WS_POPUP|WS_CAPTION|WS_SYSMENU|WS_VISIBLE
CAPTION "添加对话框"
FONT 18,"楷体" //定义对话框中的文本字体类型及大小
begin
CTEXT "代号:",1003,20,20,30,20
// EDITTEXT ID_EDITTEXT1,30,30,30,30
PUSHBUTTON "确定",IDOK,35,30,30,12endFind DIALOG 100,100,200,100
STYLE WS_POPUP|WS_CAPTION|WS_SYSMENU|WS_VISIBLE
CAPTION "添加对话框"
FONT 18,"楷体" //定义对话框中的文本字体类型及大小
begin
// CTEXT "代号:",1004,20,20,30,20
// EDITTEXT ID_EDITTEXT1,30,30,30,30
DEFPUSHBUTTON "确定",IDOK,35,30,30,12
end头文件:manage.h
-----------------------
#define ID_EDIT 100
#define ID_ADD 200
#define ID_DELETE 201
#define ID_FIND 202
#define ID_UPDATE 203
#define ID_STATIC 300
//#define ID_OK1 1001
//#define ID_OK2 1002源文件:manage.cpp
---------------------
#include <windows.h>
#include "manage.h"BOOL CALLBACK DlgProcAdd(HWND,UINT,WPARAM,LPARAM);
BOOL CALLBACK DlgProcDelete(HWND,UINT,WPARAM,LPARAM);
BOOL CALLBACK DlgProcFind(HWND,UINT,WPARAM,LPARAM);LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);HWND hdlg;
HWND hEditItem,hAdd,hDelete,hFind,hUpdate,hStatic;
HINSTANCE hInst;int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInst,LPSTR lpszCmdLine,int nCmdShow)
{
HWND hwnd;
MSG Msg;
WNDCLASS WndClass;
char lpszTitle[] = "唐朝户部大内总管";
char lpszClassName[]="实例1";
WndClass.cbClsExtra=0;
WndClass.cbWndExtra=0;
WndClass.hbrBackground=(HBRUSH)CreateSolidBrush(GetSysColor(COLOR_BTNFACE));
// WndClass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
WndClass.hCursor=LoadCursor(NULL,IDC_ARROW);
WndClass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
WndClass.hInstance=hInstance;
WndClass.lpfnWndProc=WndProc;
WndClass.lpszClassName=lpszClassName;
WndClass.lpszMenuName=NULL;
WndClass.style=CS_HREDRAW|CS_VREDRAW;
if(!RegisterClass(&WndClass))
{
MessageBeep(0);
return FALSE;
}
hwnd=CreateWindow(lpszClassName,
lpszTitle,
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
0,
400,
400,
NULL,
NULL,
hInstance,
NULL);
ShowWindow(hwnd,nCmdShow);
UpdateWindow(hwnd); hInst = hInstance;
while(GetMessage(&Msg,NULL,0,0))
{
if(!IsDialogMessage(hdlg,&Msg)) //截获非模态对话框消息并发往处理函数
{
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}
}
return Msg.wParam;
}LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
switch(message)
{
case WM_CREATE:
hEditItem = CreateWindow("EDIT",NULL,WS_CHILD|ES_AUTOHSCROLL|ES_AUTOVSCROLL
|ES_LEFT|ES_MULTILINE|WS_VISIBLE|WS_BORDER,
50,200,300,150,hwnd,(HMENU)ID_EDIT,hInst,NULL); hAdd = CreateWindow("BUTTON","添加",WS_CHILD|WS_VISIBLE,
50,20,50,30,hwnd,(HMENU)ID_ADD,hInst,NULL); hDelete = CreateWindow("BUTTON","删除",WS_CHILD|WS_VISIBLE,
50,60,50,30,hwnd,(HMENU)ID_DELETE,hInst,NULL);
hFind = CreateWindow("BUTTON","查找",WS_CHILD|WS_VISIBLE,
50,100,50,30,hwnd,(HMENU)ID_FIND,hInst,NULL); hUpdate = CreateWindow("BUTTON","更新",WS_CHILD|WS_VISIBLE,
50,140,50,30,hwnd,(HMENU)ID_UPDATE,hInst,NULL); hStatic = CreateWindow("STATIC","更新结果状态栏:",WS_CHILD|WS_VISIBLE,
50,175,150,20,hwnd,(HMENU)ID_STATIC,hInst,NULL);
break;
case WM_COMMAND:
switch(LOWORD(wParam))
{
case ID_ADD:
hdlg = CreateDialog(hInst,"Add",hwnd,(DLGPROC)DlgProcAdd);
ShowWindow(hdlg,SW_SHOW); // ShowWindow(hdlg,SW_NORMAL);
break;
case ID_DELETE:
hdlg = CreateDialog(hInst,"Delete",hwnd,(DLGPROC)DlgProcDelete);
ShowWindow(hdlg,SW_SHOW);
break;
case ID_FIND:
hdlg = CreateDialog(hInst,"Find",hwnd,(DLGPROC)DlgProcFind);
ShowWindow(hdlg,SW_SHOW);
break;
case ID_UPDATE:
break;
}
case WM_DESTROY:
PostQuitMessage(0);
break;
default: return DefWindowProc(hwnd,message,wParam,lParam); }
return false;
}BOOL CALLBACK DlgProcAdd(HWND hdlg,UINT message,WPARAM wParam,LPARAM lParam)
{
switch(message)
{
case WM_INITDIALOG:
return 1; //初始化对话框
case WM_COMMAND: //处理消息框消息
switch(LOWORD(wParam))
{
case IDOK:
DestroyWindow(hdlg); //关闭对话框
return true;
}
break;
case WM_CLOSE:
DestroyWindow(hdlg);
return 1;
}
return 0;
}BOOL CALLBACK DlgProcDelete(HWND hdlg,UINT message,WPARAM wParam,LPARAM lParam)
{
switch(message)
{
case WM_INITDIALOG:
return 1; //初始化对话框
case WM_COMMAND: //处理消息框消息
switch(LOWORD(wParam))
{
case IDOK:
DestroyWindow(hdlg); //关闭对话框
return 1;
}
break;
case WM_CLOSE:
DestroyWindow(hdlg);
return 1;
}
return 0;
}BOOL CALLBACK DlgProcFind(HWND hdlg,UINT message,WPARAM wParam,LPARAM lParam)
{
switch(message)
{
case WM_INITDIALOG:
return 1; //初始化对话框
case WM_COMMAND: //处理消息框消息
switch(LOWORD(wParam))
{
case IDOK:
DestroyWindow(hdlg); //关闭对话框
return 1;
}
break;
case WM_CLOSE:
DestroyWindow(hdlg);
return 1;
}
return 0;
}另外我想定义一些其他的按钮ID放于头文件中,然后在资源文件中包含,会出现一个错误出现在头文件中,大概是
unexpected end of file ,这是怎么回事?
和
case WM_DESTROY:
之间少了个break;
呵呵
#define ID_OK1 1001
然后在资源文件中包含头文件,DlgProcAdd函数中的ID0K也相应改为ID_OK1,为何出现:
D:\VC2\MSDEV98\MYPROJECTS\tangchao\manage.h(8) : fatal error RC1004: unexpected end of file found