如何使用visual studio2019創(chuàng)建簡單的MFC窗口(使用C++)
本文介紹了如何使用visual studio2019創(chuàng)建簡單的MFC窗口(使用C++)
```cpp
使用visual studio 2019 創(chuàng)建過程請參考Bili的上一篇文章⬇⬇
→!使用visual studio 2019 創(chuàng)建簡單的MFC窗口「使用底層的C語言」
#include<windows.h> //底層實現(xiàn)窗口的頭文件
//6.處理窗口過程
//CALLBACK 代表_stdcall 參數(shù)的傳遞順序:從右到左依次入棧,并且函數(shù)返回前清空堆棧
LRESULT CALLBACK WindowProc(HWND hand, //消息所屬窗口句柄
UINT uMsg, //具體消息名稱 WM_XXXX消息名
WPARAM wParam, //鍵盤附加消息
LPARAM lParam) { //鼠標附加消息
switch (uMsg)
{
case WM_CLOSE:
//所有以XXXXWindow為結(jié)尾的方法,都不會進入到消息隊列中,而是直接執(zhí)行
DestroyWindow(hand);//發(fā)送另一個消息WM_DESTROY
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
case WM_LBUTTONDOWN://鼠標左鍵按下
{
int xPos = LOWORD(lParam);
int yPos = HIWORD(lParam);
char buf[1024];
wsprintf(buf, TEXT("x = %d,y = %d"),xPos,yPos);
MessageBox(hand, buf, TEXT("按下鼠標左鍵"), 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;
}
//返回值用默認處理方式
return DefWindowProc(hand, uMsg, wParam, lParam);
}
/*程序入口函數(shù)
_In_ HINSTANCE hInstance,//應(yīng)用程序?qū)嵗浔?
_In_opt_ HINSTANCE hPrevInstance,//上一個應(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è)計窗口
2.注冊窗口
3.創(chuàng)建窗口
4.顯示和更新
5.通過循環(huán)取消息
6.處理消息(窗口過程)
*/
//1.設(shè)計窗口
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è)置光標,如果第一個參數(shù)為null,代表使用系統(tǒng)提供的光標
wc.hIcon = LoadIcon(NULL, IDI_ERROR); //圖標,如果第一個參數(shù)為null,代表使用系統(tǒng)提供的圖標
wc.hInstance = hInstance; //應(yīng)用程序的實例句柄,傳入winmain的形參即可
wc.lpfnWndProc = WindowProc; //回調(diào)函數(shù) 窗口過程
wc.lpszClassName = TEXT("WIN"); //指定窗口名稱
wc.lpszMenuName = NULL; //菜單名稱
wc.style = 0; //顯示風格,0代表默認
//2.注冊窗口
RegisterClass(&wc);
//3.創(chuàng)建窗口
/*lpszClassName,//類名
lpWindowName, //標題名
dwStyle, //風格 WC_OVERLAPPEDWINDOW
x, //坐標 CW_USERDEFAULT
y, //坐標
nWidth, //寬
nHeight, //高
hWndParent, //父窗口 null
hMenu, //菜單 null
hInstance, //實例句柄
lpParam //附加值 鼠標附加值*/
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; //附加消息 鼠標消息
DWORD time; //消息產(chǎn)生時間
POINT pt;*/ //附加消息 鼠標消息 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;
}
劃重點:項目->屬性->常規(guī)->高級->將MFC的使用設(shè)置為在“共享dll中使用mfc”
頭文件mfc.h
#include <afxwin.h>//mfc頭文件
class MyApp:public CWinApp{
public:
virtual BOOL InitInstance();
};
class MyFrame :public CFrameWnd {//窗口框架類
public:
MyFrame();
//聲明宏 提示消息映射機制
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()//鼠標左鍵按下
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)建簡單的MFC窗口(使用C++)的文章就介紹到這了,更多相關(guān)vs2019創(chuàng)建MFC窗口內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- VS2019創(chuàng)建C++工程的的實現(xiàn)步驟
- VS2019創(chuàng)建c++動態(tài)鏈接庫dll與調(diào)用方法實踐
- Visual Studio 如何創(chuàng)建C/C++項目問題
- c++利用vector創(chuàng)建二維數(shù)組的幾種方法總結(jié)
- Visual Studio 2022 的安裝和創(chuàng)建C++項目(圖文教程)
- VS2019如何創(chuàng)建C++項目的實現(xiàn)示例
- 探索Visual C++下創(chuàng)建WPF項目的方法示例
- Visual Studio 2019創(chuàng)建C++ Hello World項目的方法
- 在Visual Studio中用C++語言創(chuàng)建DLL動態(tài)鏈接庫圖文教程
- VC++創(chuàng)建msi文件的方法
- VC++6.0中創(chuàng)建C++項目的實現(xiàn)步驟
相關(guān)文章
C語言設(shè)計實現(xiàn)掃描器的自動機的示例詳解
這篇文章主要為大家詳細介紹了如何利用C語言設(shè)計實現(xiàn)掃描器的自動機,可識別的單詞包括:關(guān)鍵字、界符、標識符和常整型數(shù),感興趣的小伙伴可以了解一下2022-12-12
C語言中隊列的結(jié)構(gòu)和函數(shù)接口的使用示例
隊列只允許一端進行插入數(shù)據(jù)操作,在另一端進行刪除數(shù)據(jù)操作的特殊線性表,隊列具有先進先出FIFO的性質(zhì);隊列可用數(shù)組和鏈表 的方法實現(xiàn),使用鏈表的結(jié)構(gòu)實現(xiàn)更優(yōu)一些,因為如果使用數(shù)組節(jié),出隊列時刪去首元素需要將整個數(shù)組前移,效率比較低2023-02-02

