首页 > 编程语言 > 详细

mfc--孙鑫C++ 笔记 2015

时间:2020-02-28 23:04:42      阅读:55      评论:0      收藏:0      [点我收藏+]

目录

01 win32 开发 示例

消息结构体

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;
 
}

03 mfc启动过程

类继承图
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

04 画线

消息处理

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);
}

05 画线

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);
}

06菜单

消息分类:

标准消息:
除WM_COMMAND之外,所有以WM_开头的消息。从CWnd派生的类,都可以接受到这类消息
命令消息 :
来自菜单、加速键或工具栏按钮的消息。这类消息都已WM_COMMAND呈现,在MFC中,通过菜单项的标识(ID)来区分不同的命令消息;在SDK中,通告消息的wParam参数识别。
从CCmdTarget派生的类,都可以接收到这类消息。
通告消息:
由控件产生的消息。例如单击等。这类消息也是以WM_COMMAND形式呈现。
从CCmdTarget派生的类,都可以接收到这类消息。

mfc--孙鑫C++ 笔记 2015

原文:https://www.cnblogs.com/my-flash/p/12380315.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!