zoukankan      html  css  js  c++  java
  • 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_

  • 相关阅读:
    C++从文件名中去掉后缀
    《深度学习21天实战caffe》_简单读书笔记
    初等变换和阶梯矩阵【】
    A*寻路-2(忘了哪个是最终版的)
    [TWLFramework] 全局委托 全局枚举
    [TWLFramework] Singleton
    [TWLFramework] MessageCenter
    [TWLFramework] Message
    [TWLFramework] UIManager
    [TWLFramework] BasePanel
  • 原文地址:https://www.cnblogs.com/Key-Ky/p/3535902.html
Copyright © 2011-2022 走看看