最近由于兴趣爱好,学习了孙鑫的MFC教程的第一课。看完视频了,自己便用visual studio 2010尝试了MFC编程,其中遇到了一些问题。
1.vs2010不像vs6.0那样可以新建一个空的MFC应用程序,如果用vs2010 文件-新建-MFC应用程序-完成,所得到的MFC项目并不是空项目。vs2010为它提供了一些默认的模板吧(不清楚)。由于没有看懂默认提供的代码,解决的办法不是新建一个MFC应用程序,而是新建一个空项目(文件-新建-空项目),然后再在源文件夹下新建一个c++源文件,添加以下代码:
#include <Windows.h> #include <stdio.h> LRESULT CALLBACK WinSunProc( HWND hand, UINT uMsg, WPARAM wParam, LPARAM lParam ); int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd ) { WNDCLASS wndcls; wndcls.cbClsExtra = 0; wndcls.cbWndExtra = 0; wndcls.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); wndcls.hCursor = LoadCursor(NULL,IDC_CROSS); wndcls.hIcon = LoadIcon(NULL,IDI_ERROR); wndcls.hInstance = hInstance; wndcls.lpfnWndProc = WinSunProc; wndcls.lpszClassName = "ky2014"; wndcls.lpszMenuName = NULL; wndcls.style = CS_HREDRAW | CS_VREDRAW; RegisterClass(&wndcls); HWND hand; hand = CreateWindow("ky2014","ky2014",WS_OVERLAPPEDWINDOW,0,0,600,400,NULL,NULL,hInstance,NULL); ShowWindow(hand,SW_SHOWNORMAL); UpdateWindow(hand); MSG msg; while(GetMessage(&msg,NULL,0,0)){ TranslateMessage(&msg); DispatchMessage(&msg); } return 0; } LRESULT CALLBACK WinSunProc( HWND hand, UINT uMsg, WPARAM wParam, LPARAM lParam ) { switch(uMsg){ case WM_CHAR: char szChar[20]; sprintf(szChar,"char is %d",wParam); MessageBox(hand,szChar,"ky",0); break; case WM_LBUTTONDOWN: MessageBox(hand,"mouse clicked","ky",0); HDC hdc; hdc = GetDC(hand); TextOut(hdc,0,50,"计算机",strlen("计算机")); ReleaseDC(hand,hdc); break; case WM_PAINT: HDC hdc2; PAINTSTRUCT ps; hdc2 = BeginPaint(hand,&ps); TextOut(hdc2,0,0,"数学",strlen("数学")); EndPaint(hand,&ps); break; case WM_CLOSE: if(IDYES == MessageBox(hand,"是否真的结束?","ky",MB_YESNO));{ DestroyWindow(hand); } break; case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hand,uMsg,wParam,lParam); } return 0; }
再进行调试运行,最后的结果如下:
总结:
1.要有个MSDN的Library来查看WindowAPI.
2.遇到一个错误就是对于lpszClassName 是LPCWSTR类型,再查看LPCWSTR类型的定义,它是一个指向const wchar_t的指针。就产生了一个const char*类型无法转换为LPCWSTR类型的错误。原因好像是Unicode编码和ansi编码的问题。可以按这个博客的方法修改http://blog.163.com/liyani_1980/blog/static/38604145200921692710146/,也可以修改项目-属性-通用配置-常规-项目默认值-字符集,把"使用Unicode字符集"修改为“未设置”.
3.是关于代码风格的问题,现在可以利用typedef来包装c++中的常规类型,使得一看变量的类型就知道它所代表的含义。备忘typedef的一个用法。
参考:http://baike.baidu.com/link?url=a1p8FtKjaXTSxbcP6qiWPGcXUaTzYnftDDNt2t54eW3lLZMWikcHmDqGKiSAwBPgkfxJ2ugI-KTqSZmQuUMw9_