最近才学windows程序设计,看的是老版本的Charles Petzold的《windows程序设计》,书看的差不多了,想练练手,准备搞个简单的计算器,那本书上也有个,但我想弄个复杂点的、不一样的。
我先写了一个框架代码,如下:
#include <windows.h>
#include "resource.h"LRESULT CALLBACK WndProc(HWND , UINT , WPARAM , LPARAM);
BOOL CALLBACK AboutDlgProc(HWND , UINT , WPARAM , LPARAM);char szAppName[] ="Calculator";int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR szCmdLine,INT iCmdShow)
{
HWND hwnd;
MSG msg;
WNDCLASS wndclass; wndclass.style =CS_HREDRAW | CS_VREDRAW;
wndclass.lpfnWndProc =WndProc;
wndclass.cbWndExtra =DLGWINDOWEXTRA;
wndclass.cbClsExtra =0;
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,"Error occurs!","Error",MB_OK | 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)
{
switch(message)
{
case WM_CREATE:
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
} return DefWindowProc(hwnd,message,wParam,lParam);
}
主要问题在资源描述性文件上,以前模态对话框是直接插入资源就行了,而这里要自己写资源描述性文件,以前对话框描述文件都是写在.rc文件里的,我尝试了,用CreateDialog创建对话框load不进去,加入断点发现CreateDialog时并没有发出WM_CREATE消息,所以断定是load时出错了,但描述性文件又没有错误,再参考一下书上的代码,发现它把对话框描述放在了一个.DLG文件里,然后在.rc文件里包含那个.dlg文件,在执行就可以了。我很郁闷这到底是为什么?
请教!!
我的对话框描述性文件如下:
CALCULATOR DIALOG DISCARDABLE 0, 0, 120, 150
STYLE WS_OVERLAPPEDWINDOW | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX
CAPTION "Calculator"
CLASS "Calculator"
{
EDITTEXT 0,10,5,100,15
}
我先写了一个框架代码,如下:
#include <windows.h>
#include "resource.h"LRESULT CALLBACK WndProc(HWND , UINT , WPARAM , LPARAM);
BOOL CALLBACK AboutDlgProc(HWND , UINT , WPARAM , LPARAM);char szAppName[] ="Calculator";int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR szCmdLine,INT iCmdShow)
{
HWND hwnd;
MSG msg;
WNDCLASS wndclass; wndclass.style =CS_HREDRAW | CS_VREDRAW;
wndclass.lpfnWndProc =WndProc;
wndclass.cbWndExtra =DLGWINDOWEXTRA;
wndclass.cbClsExtra =0;
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,"Error occurs!","Error",MB_OK | 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)
{
switch(message)
{
case WM_CREATE:
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
} return DefWindowProc(hwnd,message,wParam,lParam);
}
主要问题在资源描述性文件上,以前模态对话框是直接插入资源就行了,而这里要自己写资源描述性文件,以前对话框描述文件都是写在.rc文件里的,我尝试了,用CreateDialog创建对话框load不进去,加入断点发现CreateDialog时并没有发出WM_CREATE消息,所以断定是load时出错了,但描述性文件又没有错误,再参考一下书上的代码,发现它把对话框描述放在了一个.DLG文件里,然后在.rc文件里包含那个.dlg文件,在执行就可以了。我很郁闷这到底是为什么?
请教!!
我的对话框描述性文件如下:
CALCULATOR DIALOG DISCARDABLE 0, 0, 120, 150
STYLE WS_OVERLAPPEDWINDOW | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX
CAPTION "Calculator"
CLASS "Calculator"
{
EDITTEXT 0,10,5,100,15
}
解决方案 »
- Pictue控件图相重绘??
- VC调用COM的问题
- 请教创建进程后,得到这个进程的窗口hwnd
- 打开进程的问题:
- 请问可以在两个线程里同时调用recv和send吗?
- 请教如何用mfc做一个窗口,可以把硬盘中记事本中的东西显示出来??~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- 怎么用我的程序控制正在播放的powerpoint翻页,谢谢!
- 如何得到鼠标点击的窗口的句柄呢 ?
- sndPlaySound函数和PlaySound在WIN7下不能播放指定的wav文件
- 如何进行写屏?有谁做过????
- 怎么判断一个IXMLDOMDocumentPtr之类的指针是否创建了实例?
- 如何在对话框里画多条颜色线
hwnd=CreateDialog(hInstance,INITRESOURCE(IDD_DIALOG),0,NULL); IDD_DIALOG改成你的对话框ID
资源模板文件,是给创建对话框的函数使用的
比如这两个函数
HWND CreateDialog(HINSTANCE hlnstance,LPCTSTR lpTemplate,HWND hWndParent,DLGPROC IpDialogFunc);
int DialogBox(HINSTANCE hlnstance,LPCTSTR lpTemplate,HWND hWndParent,DLGPROC IpDialogFunc);第二个参数就是资源的ID号具体参考
http://baike.baidu.com/view/1079962.htm
http://baike.baidu.com/view/1079950.htm
=======================================
RC文件并不是手工写的,而是用VC里面的资源编辑器画出来的,不管是SDK还是MFC在这一点上是相同的.
hwnd=CreateDialog(hInstance,MAKEINTRESOURCE(IDD_DIALOG1),0,NULL);
就行了,当然你这个有点特殊,你是将对话框当作类来用的,还要在rc文件中加入CLASS "Calculator"
我试了你的代码,如果改成上面的样子,就没有问题了.
第二个参数不是ID号,是一个指向字符串指针,如果是ID号,需要用MAKEINTRESOURCE(ID)转换成字符串指针
还有我原来在.rc文件中加入Class "Calculator"了,上面写了
但是发现上面也有很多问题,大家多讨论讨论也不错的