怎样用VC++的MFC画矩形?

2025-03-11 03:29:11
推荐回答(5个)
回答1:

相应WM_PAINT消息,然后在里面加入绘制矩形的代码。

例如:

CClientDC dc(this);//选定当前画图环境
CPen pen(PS_SOLID,1,#ff0000);//做一支红色粗细为1的笔
dc.SelectObject(&pen);//将pen放到dc上
dc.Rectangle(100,100,200,200);//画一个矩形

参考资料:

http://blog.csdn.net/zyq11223/article/details/8271006

回答2:

我不使用mfc,所以给你做了个Win32 C程序的例子,把这个理解了,mfc就是小儿科,

找个文档查询下对应的mfc类就可以完成你的目标了。


#include


LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);


int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, 

                  PSTR szCmdLine, int iCmdShow) {

  

  static TCHAR szAppName[] = TEXT("Rectangle");

  HWND hWnd;

  MSG msg;

  WNDCLASS wndClass;


  wndClass.style = CS_HREDRAW | CS_VREDRAW;

  wndClass.lpfnWndProc = WndProc;

  wndClass.cbClsExtra = 0;

  wndClass.cbWndExtra = 0;

  wndClass.hInstance = hInstance;

  wndClass.hIcon = LoadIcon(NULL, IDI_APPLICATION);

  wndClass.hCursor = LoadCursor(NULL, IDC_ARROW);

  wndClass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);

  wndClass.lpszMenuName = NULL;

  wndClass.lpszClassName = szAppName;


  if (!RegisterClass(&wndClass)) {

    MessageBox(NULL, TEXT("This Program requires Windows NT!"), szAppName, MB_ICONERROR);

    return 0;

  }


  hWnd = CreateWindow (szAppName, TEXT("Device Capabilities"), 

                      WS_OVERLAPPEDWINDOW,

                      CW_USEDEFAULT, CW_USEDEFAULT,

                      CW_USEDEFAULT, CW_USEDEFAULT,

                      NULL, NULL, hInstance, NULL); 


  ShowWindow(hWnd, iCmdShow);

  UpdateWindow(hWnd);


  while (GetMessage(&msg, NULL, 0, 0)) {

    TranslateMessage(&msg);

    DispatchMessage(&msg);

  }


  return msg.wParam;

}


LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {

  

  static int cxChar, cyChar, cxCaps;

  TCHAR szBuffer[10];

  HDC hdc;

  int i;

  PAINTSTRUCT ps;


  switch (message) {

  

    return 0;

  case WM_PAINT:

    hdc = BeginPaint(hWnd, &ps);

    Rectangle(hdc, 10, 10, 50, 200);//


    EndPaint(hWnd, &ps);

    return 0;


  case WM_DESTROY:

    PostQuitMessage(0);

    return 0;

  }


  return DefWindowProc(hWnd, message, wParam, lParam);

}


效果图:


回答3:

只需要响应两个消息:WM_LBUTTONDOWN,和WM_LBUTTONUP即可。下面是实现的代码,其中,m_OrigPoint是我在CMFCView类中添加的CPoint类型的成员变量。

//WM_LBUTTONDOWN消息响应函数
void CMFCView::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
this->m_OrigPoint=point;

CView::OnLButtonDown(nFlags, point);
}

//WM_LBUTTONUP消息响应函数
void CMFCView::OnLButtonUp(UINT nFlags, CPoint point)
{
CClientDC dc(this);
dc.Rectangle(CRect(m_OrigPoint,point));

CView::OnLButtonUp(nFlags, point);
}

回答4:

使用橡皮筋类获取画矩形的区域,然后该局此区域4个角坐标连线成一个矩形。

回答5:

1、在OnLButtonDown消息记住坐标point,并设置状态为按下。
2、在OnMouseMove里来判断按下状态并调用CDC的方法Rectangle来画矩形。