消息结构体
typedef struct tagMSG {
HWND hwnd;
UINT message;
WPARAM wParam;
LPARAM lParam;
DWORD time;
POINT pt;
} MSG, *PMSG, *LPMSG;
句柄(HANDLE)资源的标识
细分为图标句柄(HICON),光标句柄(HCURSOR),窗口句柄(HWND),应用程序实例句柄(HINSTANCE)
typedef struct tagMSG {
HWND hwnd;
UINT message;
WPARAM wParam;
LPARAM lParam;
DWORD time;
POINT pt;
} MSG;
Windows程序的入口函数
int WINAPI WinMain(
HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow);
创建一个完整的窗口:
typedef struct tagWNDCLASS {
UINT style;
WNDPROC lpfnWndProc; //回调函数
int cbClsExtra;
int cbWndExtra;
HINSTANCE hInstance;
HICON hIcon;
HCURSOR hCursor;
HBRUSH hbrBackground;
LPCTSTR lpszMenuName;
LPCTSTR lpszClassName;
} WNDCLASS, *PWNDCLASS;
LRESULT CALLBACK WindowProc(
HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam
);
消息:
BOOL GetMessage(
LPMSG lpMsg,
HWND hWnd,
UINT wMsgFilterMin,
UINT wMsgFilterMax
);
新建->Visual C++ ->Win32 -> Win32项目 -->空项目
#include <windows.h>
#include <stdio.h>
LRESULT CALLBACK WinSunProc(
HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam
);
int WINAPI WinMain(
HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
WNDCLASS wndcls;
wndcls.cbClsExtra = 0;
wndcls.cbWndExtra = 0;
wndcls.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
wndcls.hCursor = LoadCursor(NULL, IDC_CROSS);
wndcls.hIcon = LoadIcon(NULL, IDI_ERROR);
wndcls.hInstance = hInstance;
wndcls.lpfnWndProc = WinSunProc;
wndcls.lpszClassName = L"Weixin2003";
wndcls.lpszMenuName = NULL;
wndcls.style = CS_HREDRAW | CS_VREDRAW;
RegisterClass(&wndcls);
HWND hwnd;
hwnd = CreateWindow(L"Weixin2003",L"北京维新科学技术培训中心",
WS_OVERLAPPEDWINDOW,0,0,600,400,NULL,NULL,hInstance,NULL);
ShowWindow(hwnd, SW_SHOWNORMAL);
UpdateWindow(hwnd);
MSG msg;
while (GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}
LRESULT CALLBACK WinSunProc(
HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam
)
{
switch (uMsg)
{
case WM_CHAR:
wchar_t szChar[20];
swprintf(szChar, L"char is %d", wParam);
MessageBox(hwnd, szChar, L"weixin", 0);
break;
case WM_LBUTTONDOWN:
MessageBox(hwnd, L"mouse clicked", L"weixin", 0);
HDC hdc;
hdc = GetDC(hwnd);
TextOut(hdc, 0, 50, L"计算机编程语言培训", wcslen(L"计算机编程语言培训"));
ReleaseDC(hwnd, hdc);
break;
case WM_PAINT:
HDC hDC;
PAINTSTRUCT ps;
hDC = BeginPaint(hwnd, &ps);
TextOut(hDC, 0, 0, L"维新培训", wcslen(L"维新培训"));
EndPaint(hwnd,&ps);
break;
case WM_CLOSE:
if (IDYES == MessageBox(hwnd, L"是否真的结束?", L"weixin", MB_YESNO)) {
DestroyWindow(hwnd);
}
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hwnd, uMsg, wParam, lParam);
}
return 0;
}
类继承图
Hierarchy Chart
MFC 中链接的win32 的 WinMain 函数的位置
C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\atlmfc\src\mfc\appmodul.cpp
CWinApp 位置:
C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\atlmfc\src\mfc\appcore.cpp
AfxWinMain 位置:
C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\atlmfc\src\mfc?winmain.cpp
AfxEndDeferRegisterClass 位置:
C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\atlmfc\src\mfc\wincore.cpp
CFrameWnd::PreCreateWindow 位置:
C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\atlmfc\src\mfc\winfrm.cpp
thrdcore.cpp 位置:
nResult = pThread->Run(); 完成消息循环
C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\atlmfc\src\mfc\thrdcore.cpp
消息处理
C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\atlmfc\src\mfc\wincore.cpp
画线
void CMFCApplication1View::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
m_ptOrigin = point;
CView::OnLButtonDown(nFlags, point);
}
void CMFCApplication1View::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
HDC hdc;
hdc = ::GetDC(m_hWnd);
MoveToEx(hdc, m_ptOrigin.x, m_ptOrigin.y, NULL);
LineTo(hdc, point.x, point.y);
::ReleaseDC(m_hWnd, hdc);
CView::OnLButtonUp(nFlags, point);
}
CDC 画图相关
void CMFCApplication1View::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
/*HDC hdc;
hdc=::GetDC(m_hWnd);
MoveToEx(hdc,m_ptOrigin.x,m_ptOrigin.y,NULL);
LineTo(hdc,point.x,point.y);
::ReleaseDC(m_hWnd,hdc);*/
//CDC *pDC=GetDC();
//pDC->MoveTo(m_ptOrigin);
//pDC->LineTo(point);
//ReleaseDC(pDC);
//CClientDC dc(this);
//CClientDC dc(GetParent());
//dc.MoveTo(m_ptOrigin);
//dc.LineTo(point);
//CWindowDC dc(this);
//CWindowDC dc(GetParent());
/*
CWindowDC dc(GetDesktopWindow());
dc.MoveTo(m_ptOrigin);
dc.LineTo(point);
*/
/*CPen pen(PS_DASH,1,RGB(255,0,0));
CClientDC dc(this);
CPen *pOldPen=dc.SelectObject(&pen);
dc.MoveTo(m_ptOrigin);
dc.LineTo(point);
dc.SelectObject(pOldPen);*/
//CBrush brush(RGB(255,0,0));
/*CBitmap bitmap;
bitmap.LoadBitmapW(IDB_BITMAP1);
CBrush.CBrush(&bitmap);*/
//CClientDC dc(this);
////dc.FillRect(CRect(m_ptOrigin,point),&brush);
//CBrush *pBrush=CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));
//CBrush *pOldBrush=dc.SelectObject(pBrush);
//dc.Rectangle(CRect(m_ptOrigin,point));
//dc.SelectObject(pOldBrush);
m_bDraw=false;
CView::OnLButtonUp(nFlags, point);
}
void CDrawView::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
CClientDC dc(this);
CPen pen(PS_SOLID,1,RGB(255,0,0));
CPen *pOldPen=dc.SelectObject(&pen);
if(m_bDraw==true)
{
dc.SetROP2(R2_BLACK);
dc.MoveTo(m_ptOrigin);
//dc.LineTo(point);
dc.LineTo(m_ptOld);
//dc.MoveTo(m_ptOrigin);
dc.MoveTo(m_ptOld);
dc.LineTo(point);
//m_ptOrigin=point;
m_ptOld=point;
}
dc.SelectObject(pOldPen);
CView::OnMouseMove(nFlags, point);
}
CWnd:CreateSolidCaret
// TextView.cpp : CTextView 类的实现
CTextView::CTextView()
{
// TODO: 在此处添加构造代码
m_strLine = "";
m_ptOrigin=0;
m_nWidth = 0;
}
// CTextView 绘制
void CTextView::OnDraw(CDC* pDC)
{
CTextDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return;
// TODO: 在此处为本机数据添加绘制代码
CString str;
str=("维新科学技术培训中心");
pDC->TextOut(50,50,str);
CSize sz=pDC->GetTextExtent(str);
str.LoadStringW(101);
pDC->TextOut(0,200,str);
pDC->BeginPath();
pDC->Rectangle(50,50,50+sz.cx,50+sz.cy);
pDC->EndPath();
pDC->SelectClipPath(RGN_DIFF);
for(int i=0;i<300;i+=10)
{
pDC->MoveTo(0,i);
pDC->LineTo(300,i);
pDC->MoveTo(i,0);
pDC->LineTo(i,300);
}
}
// CTextView 消息处理程序
int CTextView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CView::OnCreate(lpCreateStruct) == -1)
return -1;
// TODO: 在此添加您专用的创建代码
CClientDC dc(this);
TEXTMETRIC tm;
dc.GetTextMetrics(&tm);
//CreateSolidCaret(tm.tmAveCharWidth/8,tm.tmHeight);
bitmap.LoadBitmap(IDB_BITMAP1);
CreateCaret(&bitmap);
ShowCaret();
//设置定时器
SetTimer(1,100,NULL);
return 0;
}
//接受字符消息
void CTextView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
CClientDC dc(this);
CFont font;
font.CreatePointFont(300,_T("华文行楷"),NULL);
CFont *pOldFont = dc.SelectObject(&font);
TEXTMETRIC tm;
dc.GetTextMetrics(&tm);
if(0x0d==nChar)
{
m_strLine.Empty();
m_ptOrigin.y+=tm.tmHeight;
}else if(0x08==nChar)
{
COLORREF clr=dc.SetTextColor(dc.GetBkColor());
dc.TextOutW(m_ptOrigin.x,m_ptOrigin.y,m_strLine);
m_strLine=m_strLine.Left(m_strLine.GetLength()-1);
dc.SetTextColor(clr);
}
else
{
m_strLine+=(char)nChar;
}
CSize sz=dc.GetTextExtent(m_strLine);
CPoint pt;
pt.x=m_ptOrigin.x+sz.cx;
pt.y=m_ptOrigin.y;
SetCaretPos(pt);
dc.TextOutW(m_ptOrigin.x,m_ptOrigin.y,m_strLine);
dc.SelectObject(pOldFont);
CView::OnChar(nChar, nRepCnt, nFlags);
}
void CTextView::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
SetCaretPos(point);
m_strLine.Empty();
m_ptOrigin=point;
CView::OnLButtonDown(nFlags, point);
}
// 定时器 响应函数
void CTextView::OnTimer(UINT_PTR nIDEvent)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
m_nWidth+=5;
CClientDC dc(this);
TEXTMETRIC tm;
dc.GetTextMetrics(&tm);
CRect rect;
rect.left=0;
rect.top=200;
rect.right=m_nWidth;
rect.bottom=rect.top + tm.tmHeight;
dc.SetTextColor(RGB(255,0,0));
CString str;
str.LoadStringW(IDS_WEIXIN);
dc.DrawText(str,rect,DT_LEFT);
rect.top=150;
rect.bottom=rect.top + tm.tmHeight;
dc.DrawText(str,rect,DT_RIGHT);
CSize sz=dc.GetTextExtent(str);
if(m_nWidth>sz.cx)
{
m_nWidth=0;
dc.SetTextColor(RGB(0,255,0));
dc.TextOutW(0,200,str);
}
CView::OnTimer(nIDEvent);
}
消息分类:
标准消息:
除WM_COMMAND之外,所有以WM_开头的消息。从CWnd派生的类,都可以接受到这类消息
命令消息 :
来自菜单、加速键或工具栏按钮的消息。这类消息都已WM_COMMAND呈现,在MFC中,通过菜单项的标识(ID)来区分不同的命令消息;在SDK中,通告消息的wParam参数识别。
从CCmdTarget派生的类,都可以接收到这类消息。
通告消息:
由控件产生的消息。例如单击等。这类消息也是以WM_COMMAND形式呈现。
从CCmdTarget派生的类,都可以接收到这类消息。
原文:https://www.cnblogs.com/my-flash/p/12380315.html