void CMfcSnakeDlg::SnackInit() { // 游戏区 CDC* pdc = GetDlgItem(IDC_game)->GetWindowDC(); // 棋盘初始化 CBrush* pOldBrs = pdc->SelectObject(&m_brush[3]); CPen* pOldPen = pdc->SelectObject(&pen1); for (int i = 0; i < 24; i++) { for (int j = 0; j < 50; j++) { m_map[i][j].left = 0 + j * 20; m_map[i][j].right = 20 + j * 20; m_map[i][j].top = 0 + i * 20; m_map[i][j].bottom = 20 + i * 20; pdc->SelectObject(&m_brush[3]); pdc->Rectangle(m_map[i][j]); //pdc->SelectObject(&pen1); //pdc->Rectangle(m_map[i][j]); } } pdc->SelectObject(&pOldBrs); // 蛇初始化 my_snake.init(); score = 0; START = false; DEAD = false; srand((unsigned)time(NULL)); drawSnake(); setBean(); // 控件初始化 EDIT_Score.SetWindowTextW(_T("0")); SetDlgItemText(IDC_BUTTON_Start, _T("开始")); }
时间: 2024-04-02 19:34:05 浏览: 66
这是一个 MFC 程序中的对话框类的成员函数,用于初始化游戏。首先获取 IDC_game 控件的设备上下文对象指针 pdc,然后将棋盘画刷对象 m_brush[3] 和画笔对象 pen1 选入设备上下文对象中,用于绘制棋盘。接着通过循环遍历 24 行 50 列的二维数组 m_map,初始化每个矩形的位置和大小,并调用 Rectangle() 函数绘制矩形。然后将之前选入设备上下文对象中的画刷和画笔对象恢复为原来的对象。接下来初始化蛇、得分、开始标志和死亡标志,随机设置豆子的位置,并调用 drawSnake() 函数绘制蛇和豆子。最后将得分编辑框控件 EDIT_Score 的文本设置为“0”,将“开始”按钮的文本设置为“开始”。
相关问题
Draw::Draw(CWnd* pParent /*=nullptr*/) : CDialogEx(IDD_DRAW, pParent) { } Draw::~Draw() { } void Draw::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); } void Draw::OnPaint() { //CPaintDC dc(this); // device context for painting //// TODO: 在此处添加消息处理程序代码 //// 不为绘图消息调用 CDialogEx::OnPaint() //CWnd* pWin = GetDlgItem(IDC_STATIC);//获取Picture控件的指针 //CRect rect; //pWin->GetClientRect(rect);//把控件的长宽、坐标等信息保存在rect里 //CDC* pDC = pWin->GetDC();//获取该控件的画布 //CNA_Draw-> DrawPicture(pDC, rect);//画图 CPaintDC dc(this); CWnd* pWnd = GetDlgItem(IDC_STATIC);//获得picture控件指针 CDC* pDC = pWnd->GetDC();//选取画布 CRect rect; pWnd->GetClientRect(rect);//获得picture控件大小 CNA_Draw->DrawPicture(pDC, rect); } BEGIN_MESSAGE_MAP(Draw, CDialogEx) ON_BN_CLICKED(IDOK, &Draw::OnBnClickedOk) END_MESSAGE_MAP() // Draw 消息处理程序 void Draw::OnBnClickedOk() { // TODO: 在此添加控件通知处理程序代 OnPaint(); }
根据你提供的代码,我注意到在`OnPaint()`函数中,你尝试使用了`CWnd`和`CDC`类来获取画布并进行绘图操作。然而,我没有看到你实例化`CNA_Draw`对象或者定义`DrawPicture()`函数的实现。这可能是导致无法画出图像的原因之一。
为了能够正确绘制图像,你需要确保以下几点:
1. 在`Draw`类中实例化一个名为`CNA_Draw`的对象,该对象应该具有绘制图像的功能。
2. 在`Draw`类中实现`DrawPicture()`函数,该函数应该接受一个`CDC*`类型的参数和一个表示绘图区域的`CRect`对象参数。在该函数中,你可以调用绘图函数(如`Rectangle()`、`LineTo()`等)来绘制你想要的图像。
3. 在`OnPaint()`函数中调用`CNA_Draw->DrawPicture(pDC, rect)`来执行绘图操作。
请确保你已经正确地实现了上述步骤,并在`DrawPicture()`函数中编写了能够绘制图像的代码逻辑。如果仍然无法绘制图像,请提供更多相关代码,以便我能够更好地帮助你解决问题。
CDC* pDC = GetDlgItem(IDC_STATIC)->GetDC(); GetDlgItem(IDC_STATIC)->UpdateWindow(); CRect rc; GetDlgItem(IDC_STATIC)->GetWindowRect(&rc); GetWindowRect(&rc);
这段代码是基于 MFC(Microsoft Foundation Classes)框架的代码片段。它涉及到获取静态控件(IDC_STATIC)的设备上下文(Device Context,简称DC),更新窗口,并获取窗口的矩形区域。
让我来逐行解释这段代码的作用:
1. `CDC* pDC = GetDlgItem(IDC_STATIC)->GetDC();`
这行代码通过`GetDlgItem`函数获取到静态控件(IDC_STATIC)的句柄,并调用`GetDC`函数获取该控件的设备上下文(Device Context,简称DC)。通过设备上下文,我们可以进行绘图操作等。
2. `GetDlgItem(IDC_STATIC)->UpdateWindow();`
这行代码调用`UpdateWindow`函数来立即刷新静态控件(IDC_STATIC)的显示内容,确保其更新。这个函数会强制处理窗口的消息队列,并触发重绘。
3. `CRect rc;`
这行代码声明了一个名为rc的CRect对象,用于存储矩形区域的坐标信息。
4. `GetDlgItem(IDC_STATIC)->GetWindowRect(&rc);`
这行代码通过`GetDlgItem`函数获取到静态控件(IDC_STATIC)的句柄,并调用`GetWindowRect`函数获取该控件相对于屏幕的矩形区域坐标,将结果存储在rc对象中。
5. `GetWindowRect(&rc);`
这行代码调用`GetWindowRect`函数获取当前窗口相对于屏幕的矩形区域坐标,将结果存储在rc对象中。
这段代码主要是获取静态控件(IDC_STATIC)和当前窗口的矩形区域坐标,并进行窗口的刷新操作。
希望能帮助到您,如果还有其他问题,请随时提问。
阅读全文