如何使用visual studio2019創(chuàng)建簡(jiǎn)單的MFC窗口(使用C++)
本文介紹了如何使用visual studio2019創(chuàng)建簡(jiǎn)單的MFC窗口(使用C++)
```cpp
使用visual studio 2019 創(chuàng)建過程請(qǐng)參考Bili的上一篇文章⬇⬇
→!使用visual studio 2019 創(chuàng)建簡(jiǎn)單的MFC窗口「使用底層的C語言」
#include<windows.h> //底層實(shí)現(xiàn)窗口的頭文件 //6.處理窗口過程 //CALLBACK 代表_stdcall 參數(shù)的傳遞順序:從右到左依次入棧,并且函數(shù)返回前清空堆棧 LRESULT CALLBACK WindowProc(HWND hand, //消息所屬窗口句柄 UINT uMsg, //具體消息名稱 WM_XXXX消息名 WPARAM wParam, //鍵盤附加消息 LPARAM lParam) { //鼠標(biāo)附加消息 switch (uMsg) { case WM_CLOSE: //所有以XXXXWindow為結(jié)尾的方法,都不會(huì)進(jìn)入到消息隊(duì)列中,而是直接執(zhí)行 DestroyWindow(hand);//發(fā)送另一個(gè)消息WM_DESTROY break; case WM_DESTROY: PostQuitMessage(0); break; case WM_LBUTTONDOWN://鼠標(biāo)左鍵按下 { int xPos = LOWORD(lParam); int yPos = HIWORD(lParam); char buf[1024]; wsprintf(buf, TEXT("x = %d,y = %d"),xPos,yPos); MessageBox(hand, buf, TEXT("按下鼠標(biāo)左鍵"), MB_OK); break; } case WM_KEYDOWN: //鍵盤 { MessageBox(hand, TEXT("鍵盤"), TEXT("按下鍵盤"), MB_OK); break; } case WM_PAINT: //畫圖 { PAINTSTRUCT ps; //畫圖結(jié)構(gòu)體 HDC hdc = BeginPaint(hand, &ps); TextOut(hdc, 100, 100,TEXT("hello"), strlen("hello")); EndPaint(hand, &ps); break; } default: break; } //返回值用默認(rèn)處理方式 return DefWindowProc(hand, uMsg, wParam, lParam); } /*程序入口函數(shù) _In_ HINSTANCE hInstance,//應(yīng)用程序?qū)嵗浔? _In_opt_ HINSTANCE hPrevInstance,//上一個(gè)應(yīng)用程序句柄,在WIN32環(huán)境下一般為NULL,不起作用了 _In_ LPSTR lpCmdLine,//char * argv[] _In_ int nShowCmd//顯示命令 最大化、最小化、正常 WINAPI 代表_stdcall 參數(shù)的傳遞順序:從右到左依次入棧,并且函數(shù)返回前清空堆棧*/ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd ) { /* 1.設(shè)計(jì)窗口 2.注冊(cè)窗口 3.創(chuàng)建窗口 4.顯示和更新 5.通過循環(huán)取消息 6.處理消息(窗口過程) */ //1.設(shè)計(jì)窗口 WNDCLASS wc; wc.cbClsExtra = 0; //類的額外的內(nèi)存 wc.cbWndExtra = 0; //窗口額外的內(nèi)存 wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); //設(shè)置背景 wc.hCursor = LoadCursor(NULL, IDC_HAND); //設(shè)置光標(biāo),如果第一個(gè)參數(shù)為null,代表使用系統(tǒng)提供的光標(biāo) wc.hIcon = LoadIcon(NULL, IDI_ERROR); //圖標(biāo),如果第一個(gè)參數(shù)為null,代表使用系統(tǒng)提供的圖標(biāo) wc.hInstance = hInstance; //應(yīng)用程序的實(shí)例句柄,傳入winmain的形參即可 wc.lpfnWndProc = WindowProc; //回調(diào)函數(shù) 窗口過程 wc.lpszClassName = TEXT("WIN"); //指定窗口名稱 wc.lpszMenuName = NULL; //菜單名稱 wc.style = 0; //顯示風(fēng)格,0代表默認(rèn) //2.注冊(cè)窗口 RegisterClass(&wc); //3.創(chuàng)建窗口 /*lpszClassName,//類名 lpWindowName, //標(biāo)題名 dwStyle, //風(fēng)格 WC_OVERLAPPEDWINDOW x, //坐標(biāo) CW_USERDEFAULT y, //坐標(biāo) nWidth, //寬 nHeight, //高 hWndParent, //父窗口 null hMenu, //菜單 null hInstance, //實(shí)例句柄 lpParam //附加值 鼠標(biāo)附加值*/ HWND hwnd = CreateWindow(wc.lpszClassName, TEXT("WINDOWS"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL); //4.顯示和更新 ShowWindow(hwnd, SW_SHOWNORMAL); UpdateWindow(hwnd); /*HWND hwnd; //主窗口句柄 UINT message; //具體消息名稱 WPARAM wParam; //附加消息 鍵盤消息 LPARAM lParam; //附加消息 鼠標(biāo)消息 DWORD time; //消息產(chǎn)生時(shí)間 POINT pt;*/ //附加消息 鼠標(biāo)消息 x,y //5.通過循環(huán)取消息 MSG msg; /* _Out_ LPMSG lpMsg, //消息 _In_opt_ HWND hWnd, //捕獲窗口 填null表示捕獲所有窗口 _In_ UINT wMsgFilterMin, //最大和最小的過濾消息 一般填0 _In_ UINT wMsgFilterMax);*/ while (GetMessage(&msg, NULL, 0, 0)) { /*if (GetMessage(&msg, NULL, 0, 0) == FALSE) { break; }*/ //翻譯消息 TranslateMessage(&msg); //不是false //分發(fā)消息 DispatchMessage(&msg); } return 0; }
劃重點(diǎn):項(xiàng)目->屬性->常規(guī)->高級(jí)->將MFC的使用設(shè)置為在“共享dll中使用mfc”
頭文件mfc.h
#include <afxwin.h>//mfc頭文件 class MyApp:public CWinApp{ public: virtual BOOL InitInstance(); }; class MyFrame :public CFrameWnd {//窗口框架類 public: MyFrame(); //聲明宏 提示消息映射機(jī)制 DECLARE_MESSAGE_MAP(); afx_msg void OnLButtonDown(UINT,CPoint); afx_msg void OnChar(UINT,UINT,UINT); afx_msg void OnPaint(); };
源文件mfc.cpp
#include “mfc.h” MyApp app; BOOL MyApp::InitInstance() { //創(chuàng)建窗口 MyFrame* frame = new MyFrame; //顯示和更新 frame->ShowWindow(SW_SHOWNORMAL); frame->UpdateWindow(); m_pMainWnd = frame;//保存指向應(yīng)用程序的主窗口的指針 return TRUE;//返回正常初始化 } //分界宏 BEGIN_MESSAGE_MAP(MyFrame, CFrameWnd) ON_WM_LBUTTONDOWN()//鼠標(biāo)左鍵按下 ON_WM_CHAR() ON_WM_PAINT() END_MESSAGE_MAP() MyFrame::MyFrame() { Create(NULL,TEXT(“windows”)); } void MyFrame::OnLButtonDown(UINT, CPoint point) { //TCHAR buf[1024]; //wsprintf(buf, TEXT(“x = %d,y = %d”), point.x, point.y); //MessageBox(buf); CString str; str.Format(TEXT(“x = %d,y = %d”),point.x,point.y); MessageBox(str); } void MyFrame::OnChar(UINT key, UINT, UINT) { CString str; str.Format(TEXT(“按下了%c鍵”),key); MessageBox(str); } void MyFrame::OnPaint() { CPaintDC dc(this); dc.TextOutW(100,100,TEXT(“為了部落”)); dc.Ellipse(10,10,100,100); }
到此這篇關(guān)于如何使用visual studio2019創(chuàng)建簡(jiǎn)單的MFC窗口(使用C++)的文章就介紹到這了,更多相關(guān)vs2019創(chuàng)建MFC窗口內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- VS2019創(chuàng)建C++工程的的實(shí)現(xiàn)步驟
- VS2019創(chuàng)建c++動(dòng)態(tài)鏈接庫dll與調(diào)用方法實(shí)踐
- Visual Studio 如何創(chuàng)建C/C++項(xiàng)目問題
- c++利用vector創(chuàng)建二維數(shù)組的幾種方法總結(jié)
- Visual Studio 2022 的安裝和創(chuàng)建C++項(xiàng)目(圖文教程)
- VS2019如何創(chuàng)建C++項(xiàng)目的實(shí)現(xiàn)示例
- 探索Visual C++下創(chuàng)建WPF項(xiàng)目的方法示例
- Visual Studio 2019創(chuàng)建C++ Hello World項(xiàng)目的方法
- 在Visual Studio中用C++語言創(chuàng)建DLL動(dòng)態(tài)鏈接庫圖文教程
- VC++創(chuàng)建msi文件的方法
- VC++6.0中創(chuàng)建C++項(xiàng)目的實(shí)現(xiàn)步驟
相關(guān)文章
使用c++編程實(shí)現(xiàn)簡(jiǎn)單的打字小游戲
這篇文章主要為大家介紹了使用c++編程語言來實(shí)現(xiàn)一個(gè)非常簡(jiǎn)單的打字小游戲過程實(shí)現(xiàn)的示例代碼,有需要的朋友可以借鑒參考下,希望能夠有所幫助2021-10-10C語言設(shè)計(jì)實(shí)現(xiàn)掃描器的自動(dòng)機(jī)的示例詳解
這篇文章主要為大家詳細(xì)介紹了如何利用C語言設(shè)計(jì)實(shí)現(xiàn)掃描器的自動(dòng)機(jī),可識(shí)別的單詞包括:關(guān)鍵字、界符、標(biāo)識(shí)符和常整型數(shù),感興趣的小伙伴可以了解一下2022-12-12詳細(xì)分析c++ const 指針與指向const的指針
這篇文章主要介紹了c++ const 指針與指向const的指針的相關(guān)資料,文中示例代碼非常詳細(xì),幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下2020-07-07C語言中隊(duì)列的結(jié)構(gòu)和函數(shù)接口的使用示例
隊(duì)列只允許一端進(jìn)行插入數(shù)據(jù)操作,在另一端進(jìn)行刪除數(shù)據(jù)操作的特殊線性表,隊(duì)列具有先進(jìn)先出FIFO的性質(zhì);隊(duì)列可用數(shù)組和鏈表 的方法實(shí)現(xiàn),使用鏈表的結(jié)構(gòu)實(shí)現(xiàn)更優(yōu)一些,因?yàn)槿绻褂脭?shù)組節(jié),出隊(duì)列時(shí)刪去首元素需要將整個(gè)數(shù)組前移,效率比較低2023-02-02