MFC学习-第一课 MFC运行机制

来源:互联网 发布:上海大承网络 空中网 编辑:程序博客网 时间:2024/05/22 08:13
最近由于兴趣爱好,学习了孙鑫的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_

0 0
原创粉丝点击