请教各位高手 用SDK编写基于对话框的程序 应该怎么写??
为什么我用VC写的 不能响应消息?? 根本都不能关闭 只能强制关闭~~我在程序中做如下修改:
ATOM MyRegisterClass(HINSTANCE hInstance)
{
WNDCLASSEX wcex; wcex.cbSize = sizeof(WNDCLASSEX); wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = (WNDPROC)WndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = DLGWINDOWEXTRA;//添加了DLGWINDOWEXTRA这个值
wcex.hInstance = hInstance;
wcex.hIcon = LoadIcon(hInstance, (LPCTSTR)IDI_ICECHAT);
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wcex.lpszMenuName = (LPCSTR)IDC_ICECHAT;
wcex.lpszClassName = szWindowClass;
wcex.hIconSm = LoadIcon(wcex.hInstance, (LPCTSTR)IDI_SMALL); return RegisterClassEx(&wcex);
}
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
HWND hWnd; hInst = hInstance; // Store instance handle in our global variable hWnd = CreateDialog(hInst, (LPCTSTR)IDD_MAINDLG, 0, NULL);//我修改CreateWindow为CreateDialog,IDD_MAINDLG 是我建立的 对话框模板的id if (!hWnd)
{
return FALSE;
} ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd); return TRUE;
}我实在搞不懂 为什么~~
请高手赐教了 分不够再加了~~~
谢了~~
为什么我用VC写的 不能响应消息?? 根本都不能关闭 只能强制关闭~~我在程序中做如下修改:
ATOM MyRegisterClass(HINSTANCE hInstance)
{
WNDCLASSEX wcex; wcex.cbSize = sizeof(WNDCLASSEX); wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = (WNDPROC)WndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = DLGWINDOWEXTRA;//添加了DLGWINDOWEXTRA这个值
wcex.hInstance = hInstance;
wcex.hIcon = LoadIcon(hInstance, (LPCTSTR)IDI_ICECHAT);
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wcex.lpszMenuName = (LPCSTR)IDC_ICECHAT;
wcex.lpszClassName = szWindowClass;
wcex.hIconSm = LoadIcon(wcex.hInstance, (LPCTSTR)IDI_SMALL); return RegisterClassEx(&wcex);
}
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
HWND hWnd; hInst = hInstance; // Store instance handle in our global variable hWnd = CreateDialog(hInst, (LPCTSTR)IDD_MAINDLG, 0, NULL);//我修改CreateWindow为CreateDialog,IDD_MAINDLG 是我建立的 对话框模板的id if (!hWnd)
{
return FALSE;
} ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd); return TRUE;
}我实在搞不懂 为什么~~
请高手赐教了 分不够再加了~~~
谢了~~
当然有窗口函数了~~~!!!!我就是用 新建工程 选 hello world
然后没有出现 关于对话框的选项压 我的 下一步 是灰的呀~~
用 hello world建立的 SDK程序 不是对话框呀!·!
或者 直接编写代码~~ 赫赫~~
我也是刚学
第二个 是一个 只有Win32程序 框架的 项目 建立一下 你就知道了 我也是刚刚学习 我估计 是编写游戏等 因为 里面 也是什么也没有 只有一个 大框架 用来写一些 非“标准”的程序的吧 呵呵 所有的东西 都要自己添加
第三个 是一个 标准的桌面程序 可以在 这个基础上编写 桌面应用程序 许多东西 VC已经提供了 不需要在重复编写那些一样的代码
这里没有Dialog的消息处理函数
你需要写一个自己的Dialog消息处理函数,或者直接在WndProc处理Dialog消息也行,但是这一句要改一下
hWnd = CreateDialog(hInst, (LPCTSTR)IDD_MAINDLG, 0, (DLGPROC)WndProc);
并且,WinMain的主消息循环部分也要改一下
while(GetMessage(&msg, NULL, 0, 0))
{
if(!IsWindow(hWnd) || !IsDialogMessage(hWnd), &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
这里的hWnd就是CreateDialog时返回的Dilaog Handle
switch(message)
{
case WM_COMMAND:
if(LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
{
EndDialog(hWnd, LOWORD(wParam));
return TRUE;
}
break;
}
//Alon
/**********************************************/
/* 显示 Dialog Box */
/**********************************************/
#include <windows.h>
#include "resource.h"// 函数类型说明
LRESULT CALLBACK MainDialogProc( HWND, UINT, WPARAM, LPARAM );// Windows 主函数
int APIENTRY WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow )
{
DialogBox(hInstance,MAKEINTRESOURCE(IDD_DIALOG1),NULL,(DLGPROC)MainDialogProc);
return TRUE;
}// Windows 事件处理
LRESULT CALLBACK MainDialogProc(HWND hDlg,UINT message,WPARAM wParam,LPARAM lParam)
{
//消息的处理,我想你要的就是这里了
switch(message)
{
case WM_COMMAND: //IDC_CLOSE 是我在对话框中加入的一个按钮的ID 也可以关闭
if (LOWORD(wParam)==IDC_CLOSE) PostQuitMessage(0);
return TRUE;
break;
case WM_CLOSE: //关闭在这里
EndDialog(hDlg, TRUE);
return TRUE;
break;
}
return FALSE;
}
我在程序中 改变这个值 这样 请问 有什么作用??
怎么用???
我看的是那本 Windows程序设计 全名是什么 我忘了 好像是这个 就是那本 很经典的~~
呵呵~~
国外的那本 嘿嘿~~~~
他用 CreateDialog()却可以 利用 WndProc进行消息处理~~
需不需要 我把 源程序 发上来?? 太大了~~
我是用向导 中 Win32 Application 生成的 hello world 中直接修改的代码~
改了 我上面说的两处~~ 为什么不好使呢~~
书上例子中 就可以~~还有 我这么做 有什么好处?? 和 alon21(飘一族.Alon)说的方法 之间的 区别是什么?
都有什么优缺点??
HWND CreateDialog(
HINSTANCE hInstance,
LPCTSTR lpTemplate,
HWND hWndParent,
DLGPROC lpDialogFunc
);
是个WIN32 API,他就要求必须有lpDialogFunc这个参数,否则无法处理消息,明白了没?要是这都理解不了非得自己填个NULL,我看你回家种田算了
你倒是要考虑考虑 回家种田~~
Programming Windows 中 Chapter11-Dialog Box > Modeless Dialog Box 这一节 中 一个例题 就是这么写的~~
不知道 "老农民"看过吗~~ 用他的方法为什么不行~~ 还请"老农民"指教~~~下面是这个程序的 一部分~~::#include <windows.h>LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR szCmdLine, int iCmdShow)
{
static TCHAR szAppName[] = TEXT ("HexCalc") ;
HWND hwnd ;
MSG msg ;
WNDCLASS wndclass ;
wndclass.style = CS_HREDRAW | CS_VREDRAW;
wndclass.lpfnWndProc = WndProc ;
wndclass.cbClsExtra = 0 ;
wndclass.cbWndExtra = DLGWINDOWEXTRA ; // Note!
wndclass.hInstance = hInstance ;
wndclass.hIcon = LoadIcon (hInstance, szAppName) ;
wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ;
wndclass.hbrBackground = (HBRUSH) (COLOR_BTNFACE + 1) ;
wndclass.lpszMenuName = NULL ;
wndclass.lpszClassName = szAppName ;
if (!RegisterClass (&wndclass))
{
MessageBox (NULL, TEXT ("This program requires Windows NT!"),
szAppName, MB_ICONERROR) ;
return 0 ;
}
hwnd = CreateDialog (hInstance, szAppName, 0, NULL) ;
ShowWindow (hwnd, iCmdShow) ;
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 BOOL bNewNumber = TRUE ;
static int iOperation = `=` ;
static UINT iNumber, iFirstNum ;
HWND hButton ;
switch (message)
{
case WM_KEYDOWN: // left arrow --> backspace
if (wParam != VK_LEFT)
break ;
wParam = VK_BACK ;
// fall through
case WM_CHAR:
if ((wParam = (WPARAM) CharUpper ((TCHAR *) wParam)) == VK_RETURN)
wParam = `=` ;
if (hButton = GetDlgItem (hwnd, wParam))
{
SendMessage (hButton, BM_SETSTATE, 1, 0) ;
Sleep (100) ;
SendMessage (hButton, BM_SETSTATE, 0, 0) ;
}
else
{
MessageBeep (0) ;
break ;
}
// fall through
case WM_COMMAND:
SetFocus (hwnd) ;
if (LOWORD (wParam) == VK_BACK) // backspace
ShowNumber (hwnd, iNumber /= 16) ;
else if (LOWORD (wParam) == VK_ESCAPE) // escape
ShowNumber (hwnd, iNumber = 0) ;
else if (isxdigit (LOWORD (wParam))) // hex digit
{
if (bNewNumber)
{
iFirstNum = iNumber ;
iNumber = 0 ;
}
bNewNumber = FALSE ;
if (iNumber <= MAXDWORD >> 4)
ShowNumber (hwnd, iNumber = 16 * iNumber + wParam -
(isdigit (wParam) ? `0': `A' - 10)) ;
else
MessageBeep (0) ;
}
else // operation
{
if (!bNewNumber)
ShowNumber (hwnd, iNumber =
CalcIt (iFirstNum, iOperation, iNumber)) ;
bNewNumber = TRUE ;
iOperation = LOWORD (wParam) ;
}
return 0 ;
case WM_DESTROY:
PostQuitMessage (0) ;
return 0 ;
}
return DefWindowProc (hwnd, message, wParam, lParam) ;
}=======================================================================
//下面是 资源文件
HEXCALC.RC (excerpts)//Microsoft Developer Studio generated resource script.
#include "resource.h"
#include "afxres.h"/////////////////////////////////////////////////////////////////////////////
// IconHEXCALC ICON DISCARDABLE "HexCalc.ico"/////////////////////////////////////////////////////////////////////////////#include "hexcalc.dlg"===========================================================================//下面是 对话框模板文件HEXCALC.DLG
/*---------------------------
HEXCALC.DLG dialog script
---------------------------*/HexCalc DIALOG -1, -1, 102, 122
STYLE WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX
CLASS "HexCalc"
CAPTION "Hex Calculator"
{
PUSHBUTTON "D", 68, 8, 24, 14, 14
PUSHBUTTON "A", 65, 8, 40, 14, 14
PUSHBUTTON "7", 55, 8, 56, 14, 14
PUSHBUTTON "4", 52, 8, 72, 14, 14
PUSHBUTTON "1", 49, 8, 88, 14, 14
PUSHBUTTON "0", 48, 8, 104, 14, 14
PUSHBUTTON "0", 27, 26, 4, 50, 14
PUSHBUTTON "E", 69, 26, 24, 14, 14
PUSHBUTTON "B", 66, 26, 40, 14, 14
PUSHBUTTON "8", 56, 26, 56, 14, 14
PUSHBUTTON "5", 53, 26, 72, 14, 14
PUSHBUTTON "2", 50, 26, 88, 14, 14
PUSHBUTTON "Back", 8, 26, 104, 32, 14
PUSHBUTTON "C", 67, 44, 40, 14, 14
PUSHBUTTON "F", 70, 44, 24, 14, 14
PUSHBUTTON "9", 57, 44, 56, 14, 14
PUSHBUTTON "6", 54, 44, 72, 14, 14
PUSHBUTTON "3", 51, 44, 88, 14, 14
PUSHBUTTON "+", 43, 62, 24, 14, 14
PUSHBUTTON "-", 45, 62, 40, 14, 14
PUSHBUTTON "*", 42, 62, 56, 14, 14
PUSHBUTTON "/", 47, 62, 72, 14, 14
PUSHBUTTON "%", 37, 62, 88, 14, 14
PUSHBUTTON "Equals", 61, 62, 104, 32, 14
PUSHBUTTON "&&", 38, 80, 24, 14, 14
PUSHBUTTON "|", 124, 80, 40, 14, 14
PUSHBUTTON "^", 94, 80, 56, 14, 14
PUSHBUTTON "<", 60, 80, 72, 14, 14
PUSHBUTTON ">", 62, 80, 88, 14, 14
}还请"老农民"解释一下~
这种方式太复杂,用了非公开的技术,我前面提供的方式属于正规的方法,很容易理解的
这个地方 我弄了好几天 一直都不明白 为什么~~
现在懂了~~
谢谢 “老农民” 了~~ 特别感谢~
呵呵~~~~还有一个问题~
用Modal Box 和 Modaless Box 都有什么优缺点? 我是说 做这样的 基于对话框的程序中 主窗体对话框~可否把你的QQ 告诉我? 呵呵~~
向你学习学习~~ 呵呵~~ 谢谢了~ :)