MFC(2):底层实现窗口、MFC窗口创建与消息映射、windows字符集和向导的使用


=====================从底层去实现一个窗口===============

程序入口是WinMain函数

窗口的创建步骤:
-->  设计(WNDCLASS) 
-->  注册(RegisterClass) 
-->  创建(CreateWindow) 
-->  显示(ShowWindow、UpdateWindow) 
-->  消息循环(MSG、GetMessage、DispatchMessage、TraslateMessage) 
MSG msg;
while(GetMessage(&msg, null, 0, 0))
{
    TraslateMessage(&msg);
    DispatchMessage(&msg);
}

-->  消息处理函数(DefWindowProc、swicth判断)
LREAULT CALLBACK WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch(uMsg)
    {
    case WM_CLOSE: DestroyWindow(hWnd);    break;
    case WM_DESTROY: PostQuitMessage(0);    break; 
    case WM_LBUTTONDOWN: 
        {int xPos = LOWORD(wParam); int yPos = HIWORD(lParam); 
        char buf[1024];    wsprintf(buf, TEXT("x = %d, y = %d"), xPos, yPos);
        MessageBox(hWnd, buf, TEXT("鼠标按下"), MB_OK);    }
    }
}

======================创建一个MFC程序==================

程序的入口是InitInstance,该函数是CWinApp的虚函数,程序员需要自己编写该类的子类CMyApp并重写该函数
程序具有唯一的全局应用程序对象,CMyApp theApp;
BOOL CMyApp::InitInstance()
{
    CMyFrame * myFrame = new CMyFrame;
    
    m_pMainWnd = myFrame; //保存指向应用程序的主窗口指针
    
    myFrame->ShowWindow(SW_SHOW);
    myFrame->UpdateWindow();
    return TRUE;
}

消息映射机制:要对那个窗口使用消息映射机制,就在该类的头文件中声明宏DECLARE_MESSAGE_MAP()
在类的实现(源文件)中,定义实现宏IMPLEMENT_MESSAGE_MAP和分界宏
BEGIN_MESSAGE_MAP(本类,他爹)
消息宏...
END_MESSAGE_MAP()

以 ON_WM_LBUTTONDOWN()为例:
头文件中:afx_msg void OnLButtonDown(UINT, CPoint);
对应消息宏: ON_WM_LBUTTONDOWN()
源文件中的实现:void OnLButtonDown(UINT, CPoint) 
                    {CString str; str.Format(TEXT("x = %d, y = %d"), point.x, point.y);
                     MessageBox(str, TEXT("鼠标按下"));}
                 
以 ON_WM_POINT()为例:
头文件中:afx_msg void OnPaint();
对应消息宏: ON_WM_POINT()
源文件中的实现:void OnPaint() 
                { CPaint dc(this); //先请一个画家
                  dc.TextOut(100, 100, "这事儿是画家干的");
                  dc.Ellipse(10, 10, 100, 100);}


======================Windows字符集====================

一个字符对应一个字节 多字节
一个字符对应单个字节 宽字节(unicode、GBK) wchar_t
多字节转宽字节 L
TEXT()函数将字符串转换为当前格式,具备自适应编码转换功能
MFC中TCHAR具有自适应编码转换的字符

统计字符串长度
int num = 0;
char* p = "aaaa";
num = strlen(p);

wchar_t *p2 = L"aaaa";
num = wcslen(p2)

char*与CString之间的转换与逆转换
char* p3 = "ccc";
CString str = CString(p3);// 调用构造函数

CStingA tmp = str;
char* p = tmp.GetBuffer();


==================MFC向导创建程序======================

新建项目-->MFC应用程序-->单个文档、MFC标准(一路下一步到生成的类)
生成了四个类:视图类、应用程序类、文档类和主框架窗口类
MFC程序通常不看解决方案,而是看的类视图(视图-->类视图)
类视图分为上下两栏:上栏点击可以进入头文件,下栏点击进入相应的类函数

消息处理都写在Frame类中,右键-->属性-->消息-->add,自动生成代码;不想要在 消息-->delete 即可逻辑删除(即注释掉)
不够智能的一点是delete逻辑删除后,再add并不会打开注释而是重新再写一份

主框架窗口类相当于相框,视图类相当于相片;数据的存储和加载由文档类完成,显示和修改用视图类来完成
要显示的东西放在视图类中
OnDraw和OnPaint区别:同时存在前者会覆盖后者,因此不要同时出现;通常不会写OnPaint

InitInstance为程序入口,PreCreateWindow为程序员提供了修改程序外观的机会
OnCreate和Create的区别:前者负责注册并产生窗口,后者不产生但在窗口显示前设置窗口格式
Create --> WM_CREATE --> OnCreate

afx开头的是全局函数 AfxMessageBox
afx_msg是消息函数的标识
 

猜你喜欢

转载自blog.csdn.net/m1m2m3mmm/article/details/83316785