• MFC中小笔记(四)


    12、编译透明化界面是出现  WS_EX_LAYERED  AC_SRC_ALPHA ULW_ALPHA ULW_OPAQUE  undeclared identifier ,搜索发现SDK版本过低。

    方法1:搜索SDK,下载合适的SDK(sdk地址)。但是高版本的SDK开发的程序,在低版本上运行时就得需要相当版本的运行库(如果在VS2008上开发的程序,调用了只有.net 3.5之后才有的函数库或者引用头文件,在XP没有装.net 3.5的系统上,是无法正常打开的)。

    方法2:自己定义其中的宏,在开发过程中是没关系的。

    /*定义高版本的SDK中的宏*/
    
    #define WS_EX_LAYERED 0x00080000
    #define  AC_SRC_ALPHA  0x01
    #define  ULW_ALPHA 0x00000002
    #define  ULW_COLORKEY 0x00000001

    13、UpdateLayeredWindow  : undeclared identifier 

    原因:SDK版本过低。如果在低版本中调用API的UpdateLayeredWindow  ,通过调用动态链接库。 官方解释 连接

    /* 通过动态链接库调用 UpdateLayerWindow */
    
    
        HINSTANCE hInst = LoadLibrary("User32.DLL"); 
        if(hInst) 
        { 
            typedef BOOL(WINAPI *UpdateLayeredWindow)(HWND,HDC,POINT *,SIZE *,HDC,POINT *,COLORREF,BLENDFUNCTION *,DWORD);
            UpdateLayeredWindow myfunc= NULL;   
            
            //取得UpdateLayeredWindow函数指针 
            myfunc=(UpdateLayeredWindow)GetProcAddress(hInst, "UpdateLayeredWindow");
            
            if(myfunc)
                myfunc(m_hWnd, pDC->m_hDC,  &point, &size, MemDC, &pointSrc, 0, &blend,  ULW_ALPHA : ULW_COLORKEY);
            FreeLibrary(hInst); 
    }

    关于最后一个参数的解释说明:

    /* dwFlags  的解释说明 */
    dwFlags [in]
        Type: DWORD
        This parameter can be one of the following values.
        Value    Meaning
    //----------------------------------------------------------------
        ULW_ALPHA                  Use pblend as the blend function. If the display mode is 256 
        0x00000002                 colors or less, the effect of this value is the same as the effect of 
    ULW_OPAQUE.
    //----------------------------------------------------------------
        ULW_COLORKEY           Use crKey as the transparency color.
        0x00000001 
       
    //----------------------------------------------------------------
        ULW_OPAQUE        Draw an opaque layered window.
        0x0000000     
      
        If hdcSrc is NULL, dwFlags should be zero.
    View Code

    14、在编写含有皮肤、图片的程序,尽量减少将资源导入到 Resource.h 中,那样会增大程序的体积。最好的方式是采用 动态加载的方式。

    15、AlphaBlend  is not a member of CDC  采用系统的API 进行替换。

    16、ON_WM_NCHITTEST    消息的返回值,在不同的SDK下不同。

    错误再现:error C2440: 'type cast' : cannot convert

          from  'long (__thiscall CMyWnd::*)(class CPoint)'

          to  'unsigned int (__thiscall CWnd::*)(class CPoint)'
        Pointers to members have different representations; cannot cast between them

     afx_msg UINT OnNcHitTest(CPoint point);  //VC6.0

    afx_msg LRESULT OnNcHitTest(CPoint point);//VS2008

    17、错误再现

    MyBase.obj : error LNK2001: unresolved external symbol "public: virtual struct CRuntimeClass * __thiscall CMyBase::GetRuntimeClass(void)const " (?GetRuntimeClass@CDlgBase@@UBEPAUCRuntimeClass@@XZ)
    MyDlg.obj : error LNK2001: unresolved external symbol "public: virtual struct CRuntimeClass * __thiscall CMyBase::GetRuntimeClass(void)const " (?GetRuntimeClass@CDlgBase@@UBEPAUCRuntimeClass@@XZ)

    原因:在类定义中,DECLARE_DYNAMIC(CMyBase)声明了这样一个定义宏,旨在确定运行时对象属于哪一个类而定义的宏。

    DEClARE_DYNCREATE/IMPLEMENT_DYNCREATE 是为了“动态创建"类的实例而定义的宏。new可以用来创建对象,但不是动态的。

    /*下面的做法是通不过的:*/
    char szClassName[60];
    cin >> szClassName;
    CObject* pOb=new szClassName; //通不过
    
    这里就要用到DEClARE_DYNCREATE/IMPLEMENT_DYNCREATE定义的功能了。 

    但是在使用过程中,如果不进行解释说明 IMPLEMENT_DYNAMIC(CMyBase, CBase) 会出现GetRuntimeClass 错误。出现此错误,可以查看 DECLARE_DYNAMIC 定义。

    MSDN解释(点击 连接)。

    /*  DECLARE_DYNAMIC 定义 */
    
    #define _DECLARE_DYNAMIC(class_name) 
    public: 
        static AFX_DATA CRuntimeClass class##class_name; 
        virtual CRuntimeClass* GetRuntimeClass() const; 
    
    #endif
    
    // not serializable, but dynamically constructable
    #define DECLARE_DYNCREATE(class_name) 
        DECLARE_DYNAMIC(class_name) 
        static CObject* PASCAL CreateObject();
    DECLARE_DYNAMIC 定义
  • 相关阅读:
    mybatis动态SQl中int类型字段为0 SQl语句不拼接
    Ansible学习(pyenv与virtualenv)
    word
    github学习
    OpenStack搭建遇到的问题2(组件配置错误了,别重装全部,就把模块卸载就行了)
    OpenStack搭建遇到的问题
    Ubuntu 17.04 安装
    docker学习(一)
    MySQL安装
    来自Google的响应式——Agera
  • 原文地址:https://www.cnblogs.com/Bachelor/p/3572623.html
Copyright © 2020-2023  润新知