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

最近由于兴趣爱好,学习了孙鑫的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_

posted @ 2014-01-28 19:17  Key_Ky  阅读(739)  评论(0编辑  收藏  举报