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

xiaoxiao2022-06-11  16

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

程序入口是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是消息函数的标识  

转载请注明原文地址: https://www.6miu.com/read-4930659.html

最新回复(0)