VC杂记 2011/05/22 WTL

1. 杂问

Q:所有conf-client的项目介绍及物理位置?

Q:Why在VA中搜索不到GetProcAddress函数?

Q:SourceInsight的使用?

Q:VC6如何处理LinuxC++工程?

Q:我们的UI库到底做过什么功能?

Q:My1stWTL70Win项目的所有文件为什么都看不见了?

    A:估计是*.dsp文件里的SOURCE项因故丢失了(比如突然关机)

Q:我们的Component库似乎实现了类似COM++的什么功能?

Q:VC6中,如何把一些已经有的*.cpp/*.h放进project中?

    A:在文件tab中,右击folder,选择Add Files to Folder

Q:Why在VA的symbol搜索里找不到CFrameWindowImpl?

 

 

2. WTL前期工作总结

* 使用WTL的wizard完成一个例子HelloWTL70Win,可以运行

* 参照Wizard的例子,手工完成过一个例子,My1stWTL70Win,有main framewindow,也有view

把这两个例子重新做一遍

 

3. HelloWTL70Win2

* 安装

E:/software-repository/cpp/vc/wtl70/AppWiz60/setup.js,执行即可

* 使用

安装WTL70 Wizard后,在File/New/Project中会有相关选项出现


* WTL基本过程总结

初始化WTL环境:   

    HRESULT hRes = ::CoInitialize(NULL);

实例化Loop instance并加入到_Module

实例化主窗口对象并显示(窗口类注册陷含完成了)

执行Loop中的消息循环:

    theLoop.run();

删除Loop instance

清理WTL环境

    _Module.Term();
    ::CoUninitialize();

 

注:必须定义一个CModuleApp对象:

CAppModule _Module;

 

 

4. My2ndWTL70Win项目

 

* build/compile Error

e:/projects-workspace/box-4.2-ucp-4.5-0429/src/uilib/wtl80/atlframe.h(22) : fatal error C1189: #error :  atlframe.h requires atlapp.h to be included first
Error executing cl.exe.

 

注1:搞不清状况,重新建一个project,建立的时候选择empty win32。

 

5. My2ndWTL70Win2项目

使用File/New加入一个新的文件:My2ndWTL70Win2.cpp

结果仍然出现4.中的同样问题。

 

6. 让上次写的My1stWTL70Win项目恢复工作

* 把以前的项目目录变成My1stWTL70Win.bak

* 新建一个My1stWTL70Win

* 将所有文件copy到新目录

* 在文件栏里把相关文件加入project

* 处理MyView.cpp的一些问题后OK

 

7. 定位4.与5.中出现的问题

经反复检查,发现My1stWTL70Win项目中,有一个stdafx.h,其中内容如下:

 

// Change these values to use different versions
#define WINVER        0x0400
//#define _WIN32_WINNT    0x0400
#define _WIN32_IE    0x0400
#define _RICHEDIT_VER    0x0100

#include
#include

extern CAppModule _Module;
#include

 

所以,这是在WTL Wizard中设置的,通过这种方式包含了正确的头文件!

Note:也就是说,在WTL Wizard中,stdafx.h中会自动包含正确的头文件,而手工做的时候,需要自己去包含。 2011/11/15

 

8. 重做My2ndWTL70Win项目

 

* Error:

MyMainWnd.cpp
d:/study/wtl/hellowtl70/my1stwtl70win/mymainwnd.h(13) : error C2504: 'CFrameWindowImpl' : base class undefined
d:/study/wtl/hellowtl70/my1stwtl70win/mymainwnd.h(13) : error C2143: syntax error : missing ',' before '<'
d:/study/wtl/hellowtl70/my1stwtl70win/mymainwnd.h(13) : error C2059: syntax error : '<'

奇怪的是,当前project是My2ndWTL70Win,但报出的错误却在My1stWTL70Win!

 

把MyMainWnd.cpp从project去掉,并将其constuctor/deconstructor在MyMainWnd.h中实现,OK!

 

## 目前为止,一个空白的Window出来,但没有任何东东显示 ,下一步让Window里有view,并在view里显示东东 ##

 

* 定义MyView实例,Error

d:/study/wtl/hellowtl70/my2ndwtl70win/mymainwnd.h(15) : error C2146: syntax error : missing ';' before identifier 'MyView'
d:/study/wtl/hellowtl70/my2ndwtl70win/mymainwnd.h(15) : error C2501: 'CMyView' : missing storage-class or type specifiers
d:/study/wtl/hellowtl70/my2ndwtl70win/mymainwnd.h(15) : error C2501: 'MyView' : missing storage-class or type specifiers

 

增加头头文件引用:#include "myview.h", OK !

 

* 把MyView加进MyMainWnd,在CMyMainWnd::OnCreate里

 LRESULT OnCreate(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
    {
        m_hWndClient = MyView.Create(m_hWnd, rcDefault, NULL, WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN, WS_EX_CLIENTEDGE);   
        //CMessageLoop* pLoop = _Module.GetMessageLoop();
        //ATLASSERT(pLoop != NULL);
        return 0;
    }

* 在消息印射中一定加入CHAIN_MSG_MAP

    DECLARE_FRAME_WND_CLASS(NULL, NULL)
    BEGIN_MSG_MAP(CMyMainWnd)
        MESSAGE_HANDLER(WM_CREATE, OnCreate)
        CHAIN_MSG_MAP(CFrameWindowImpl) // this is a must, otherwise, no message handled by view. but WHY ?
    END_MSG_MAP()

 

## 到目前(20:20),一个完整的WTL程序可运行,耗时约4小时 ##

 

9.最后的问题:

Q:WHY不能有CMyMainWnd.cpp与CMyView.cpp?

Q: CHAIN_MSG_MAP做了什么东东?

 

 

 

 

 

 

 

你可能感兴趣的:(wtl)