MFC中的窗體繪制事件函數:OnCtlColor、OnPaint、OnNcPaint、OnDrawItem、OnEraseBkgnd、OnDraw

文章目錄

  • CWnd::OnCtlColor
  • CWnd::OnPaint
  • CWnd::OnNcPaint
  • CWnd::OnDrawItem
  • CWnd::OnEraseBkgnd
  • CWnd::InvalidateRect
  • CView::OnDraw

參考:https://learn.microsoft.com/

CWnd::OnCtlColor

即將繪制子控件時,框架會調用此成員函數。

afx_msg HBRUSH OnCtlColor(CDC* pDC,CWnd* pWnd,UINT nCtlColor);

參數
pDC
包含指向子窗口的顯示上下文的指針。 可能是暫時性指針。

pWnd
包含指向請求顏色的控件的指針。 可能是暫時性指針。

nCtlColor
包含以下用于指定控件類型的值之一:

CTLCOLOR_BTN 按鈕控件

CTLCOLOR_DLG 對話框

CTLCOLOR_EDIT 編輯控件

CTLCOLOR_LISTBOX 列表框控件

CTLCOLOR_MSGBOX 消息框

CTLCOLOR_SCROLLBAR 滾動條控件

CTLCOLOR_STATIC 靜態控件

返回值
OnCtlColor 必須返回用于繪制控件背景的畫筆的句柄。

注解
大多數控件將此消息發送到其父級(通常是一個對話框),以準備 pDC 來使用正確的顏色繪制控件。

若要更改文本顏色,請使用所需的紅綠藍 (RGB) 值調用 SetTextColor 成員函數。

若要更改單行編輯控件的背景色,請在 CTLCOLOR_EDIT 和 CTLCOLOR_MSGBOX 消息代碼中設置畫筆句柄,并調用 CDC::SetBkColor 函數來響應 CTLCOLOR_EDIT 代碼。

不會對下拉組合框的列表框調用 OnCtlColor,因為下拉列表框實際上是組合框的子級,而不是窗口的子級。 若要更改下拉列表框的顏色,請在 nCtlColor 參數中創建一個 CComboBox,并在其中包含一個用于檢查 CTLCOLOR_LISTBOX 的 OnCtlColor 重寫。 在此處理程序中,必須使用 SetBkColor 成員函數來設置文本的背景色。

備注

框架調用此成員函數來支持你的應用程序處理 Windows 消息。 傳遞到函數的參數反映了收到消息時框架所接收的參數。 如果調用此函數的基類實現,該實現將使用最初隨消息傳遞的參數,而不是你提供給該函數的參數。 若要將以下方法添加到對話框類,請使用 Visual Studio 屬性窗格添加 WM_CTLCOLOR 的消息處理程序。 或者,可以手動將 ON_WM_CTLCOLOR() 條目添加到消息映射。

示例

// This OnCtlColor handler will change the color of a static control
// with the ID of IDC_MYSTATIC. The code assumes that the CPenWidthsDlg
// class has an initialized and created CBrush member named m_brush.
// The control will be painted with red text and a background
// color of m_brush.
HBRUSH CPenWidthsDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{// Call the base class implementation first! Otherwise, it may// undo what we're trying to accomplish here.HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);// Are we painting the IDC_MYSTATIC control? We can use// CWnd::GetDlgCtrlID() to perform the most efficient test.if (pWnd->GetDlgCtrlID() == IDC_MYSTATIC){// Set the text color to redpDC->SetTextColor(RGB(255, 0, 0));// Set the background mode for text to transparent // so background will show thru.pDC->SetBkMode(TRANSPARENT);// Return handle to our CBrush objecthbr = m_brush;}return hbr;
}

CWnd::OnPaint

當 Windows 或應用程序請求重繪應用程序窗口的一部分時,框架會調用此成員函數。

afx_msg void OnPaint();

注解
在調用 UpdateWindow 或 RedrawWindow 成員函數時發送 WM_PAINT 消息。

由于在設置了 RDW_INTERNALPAINT 標志的情況下調用了 RedrawWindow 成員函數,窗口可能會收到內部繪制消息。 在這種情況下,窗口可能不包含更新區域。 應用程序應調用 GetUpdateRect 成員函數來確定窗口是否包含更新區域。 如果 GetUpdateRect 返回 0,則應用程序不應調用 BeginPaint 和 EndPaint 成員函數。

應用程序需負責通過在其內部數據結構中查找每個 WM_PAINT 消息來檢查任何必要的內部重繪或更新,因為 WM_PAINT 消息可能是由無效區域以及在設置了 RDW_INTERNALPAINT 標志的情況下調用 RedrawWindow 成員函數而導致的。

Windows 僅發送內部 WM_PAINT 消息一次。 在 UpdateWindow 成員函數將內部 WM_PAINT 消息發送到某個窗口后,在該窗口失效或者在設置了 RDW_INTERNALPAINT 標志的情況下再次調用 RedrawWindow 成員函數之前,不會發送或發布更多的 WM_PAINT 消息。

CWnd::OnNcPaint

需要繪制非工作區時,框架會調用此成員函數。

afx_msg void OnNcPaint();

注解
默認實現繪制窗口框架。

應用程序可以重寫此調用并繪制其自身的自定義窗口框架。 剪切區域始終是矩形,即使框架的形狀已更改。

CWnd::OnDrawItem

當控件或菜單的視覺方面發生更改時,框架將對所有者繪制按鈕控件、組合框控件、列表框控件或菜單的所有者調用此成員函數。

afx_msg void OnDrawItem(int nIDCtl,LPDRAWITEMSTRUCT lpDrawItemStruct);

參數
nIDCtl
包含發送了 WM_DRAWITEM 消息的控件的標識符。 如果菜單發送了消息,則 nIDCtl 包含 0。

lpDrawItemStruct
指定指向 DRAWITEMSTRUCT 數據結構的長指針,該結構包含有關要繪制的項和所需繪制類型的信息。
注解
DRAWITEMSTRUCT 結構的 itemAction 成員定義要執行的繪制操作。 此成員中的數據允許控件所有者確定所需的繪制操作。

在處理此消息后返回之前,應用程序應確保 DRAWITEMSTRUCT 結構的 hDC 成員所標識的設備上下文已還原到默認狀態。

如果 hwndItem 成員屬于 CButton、CMenu、CListBox 或 CComboBox 對象,則調用相應類的 DrawItem 虛擬函數。 重寫相應控件類的 DrawItem 成員函數可繪制項。

備注

框架調用此成員函數來支持你的應用程序處理 Windows 消息。 傳遞到函數的參數反映了收到消息時框架所接收的參數。 如果調用此函數的基類實現,該實現將使用最初隨消息傳遞的參數,而不是你提供給該函數的參數。

CWnd::OnEraseBkgnd

當 CWnd 對象背景需要擦除時(例如,調整大小時),框架會調用此成員函數。

afx_msg BOOL OnEraseBkgnd(CDC* pDC);

參數
pDC
指定設備上下文對象。

返回值
如果擦除背景,則返回非零值;否則返回 0。

注解
調用它來準備一個用于繪制的失效區域。

默認實現使用窗口類結構的 hbrBackground 成員指定的窗口類背景畫筆來擦除背景。

如果 hbrBackground 成員為 NULL,則 OnEraseBkgnd 的重寫版本應擦除背景色。 該版本還應通過首先對畫筆調用 UnrealizeObject,然后選擇畫筆,將所需畫筆的原點與 CWnd 坐標對齊。

如果重寫的 OnEraseBkgnd 處理消息并擦除背景,則它應返回非零值以響應 WM_ERASEBKGND;這表示不需要進一步擦除。 如果它返回 0,則窗口將仍舊標記為需要擦除。 (通常,這意味著 PAINTSTRUCT 結構的 fErase 成員將是 TRUE。)

Windows 假設使用 MM_TEXT 映射模式來計算背景。 如果設備上下文使用任何其他映射模式,則擦除的區域可能不在工作區的可見部分內。

備注

框架調用此成員函數來支持你的應用程序處理 Windows 消息。 傳遞到函數的參數反映了收到消息時框架所接收的參數。 如果調用此函數的基類實現,該實現將使用最初隨消息傳遞的參數,而不是你提供給該函數的參數。

CWnd::InvalidateRect

通過將給定矩形添加到 CWnd 更新區域,使給定矩形中的工作區失效。

void InvalidateRect(LPCRECT lpRect,BOOL bErase = TRUE);

參數
lpRect
指向包含要添加到更新區域的矩形(以客戶端坐標表示)的 CRect 對象或 RECT 結構。 如果 lpRect 為 NULL,則將整個工作區添加到該區域。

bErase
指定是否要擦除更新區域中的背景。

注解
在發送下一條 WM_PAINT 消息時,會將失效矩形連同更新區域中的所有其他區域一起標記為可繪制。 失效區域在更新區域中累積到在下一次發生 WM_PAINT 調用時處理該區域,或者該區域被 ValidateRect 或 ValidateRgn 成員函數驗證為止。

bErase 參數指定在處理更新區域時是否要擦除更新區域中的背景。 如果 bErase 為 TRUE,則在調用 BeginPaint 成員函數時擦除背景;如果 bErase 為 FALSE,則背景將保持不變。 對于更新區域的任何部分,如果 bErase 為 TRUE,則會擦除整個區域(而不僅僅是給定部分)中的背景。

每當 CWnd 更新區域不為空并且該窗口的應用程序隊列中沒有其他消息時,Windows 就會發送一條 WM_PAINT 消息。

類似的函數
MFC中的CWnd::Invalidate、CWnd::InvalidateRgn

void Invalidate(BOOL bErase = TRUE);
void InvalidateRect(LPCRECT lpRect, BOOL bErase = TRUE);

WIN32API中的InvalidateRect

BOOL InvalidateRect([in] HWND       hWnd,[in] const RECT *lpRect,[in] BOOL       bErase
);

CView::OnDraw

由框架調用以呈現文檔的圖像。

virtual void OnDraw(CDC* pDC) = 0;

參數
pDC
指向用于呈現文檔圖像的設備上下文。

注解
框架調用此函數以執行屏幕顯示、打印和打印預覽,并在每種情況下傳遞不同的設備上下文。 沒有默認實現。

必須重寫此函數才能顯示文檔的視圖。 可以使用 pDC 參數所指向的 CDC 對象發出圖形設備接口 (GDI) 調用。 可以在繪圖前在設備上下文中選擇 GDI 資源(例如筆或字體),之后將取消選擇它們。 通常,繪圖代碼可以與設備無關;也就是說,不需要有關哪種類型的設備顯示圖像的信息。

若要優化繪圖,請調用設備上下文的 RectVisible 成員函數,以確定是否繪制給定的矩形。 如果需要區分普通屏幕顯示和打印,請調用設備上下文的 IsPrinting 成員函數。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/42401.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/42401.shtml
英文地址,請注明出處:http://en.pswp.cn/news/42401.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

React 高階組件(HOC)

React 高階組件(HOC) 高階組件不是 React API 的一部分,而是一種用來復用組件邏輯而衍生出來的一種技術。 什么是高階組件 高階組件就是一個函數,且該函數接受一個組件作為參數,并返回一個新的組件。基本上,這是從 React 的組成…

Mongodb 更新集合的方法到底有幾種 (中) ?

更新方法 Mongodb 使用以下幾種方法來更新文檔 &#xff0c; Mongodb V5.0 使用 mongosh 客戶端&#xff1a; db.collection.updateOne(<filter>, <update>, <options>) db.collection.updateMany(<filter>, <update>, <options>) db.c…

docker 安裝elasticsearch、kibana

下載es鏡像 docker pull elasticsearch 啟動es容器 docker run --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.typesingle-node" -e ES_JAVA_OPTS"-Xms512m -Xmx512m" -d elasticsearch 驗證es界面訪問 ?????http://節點ip:9200/ ?…

client-go實戰之十二:選主(leader-election)

歡迎訪問我的GitHub 這里分類和匯總了欣宸的全部原創(含配套源碼)&#xff1a;https://github.com/zq2599/blog_demos 本篇概覽 本文是《client-go實戰》系列的第十二篇&#xff0c;又有一個精彩的知識點在本章呈現&#xff1a;選主(leader-election)在解釋什么是選主之前&…

【自用】云服務器 docker 環境下 HomeAssistant 安裝 HACS 教程

一、進入 docker 中的 HomeAssistant 1.查找 HomeAssistant 的 CONTAINER ID 連接上云服務器&#xff08;宿主機&#xff09;后&#xff0c;終端內進入 root &#xff0c;輸入&#xff1a; docker ps找到了 docker 的 container ID 2.config HomeAssistant 輸入下面的命令&…

修改el-table行懸停狀態的背景顏色

.content:deep().el-table tr:hover>td {background-color: #f5f5f5 !important; /* 設置懸停時的背景顏色 */ }/*這一點很重要&#xff0c;否則可能會導致hover行時操作列還是原來的背景色*/ .content:deep().el-table__body tr.hover-row>td{background-color: #f5f5f5…

使用Nacos配置中心動態管理Spring Boot應用配置

&#x1f337;&#x1f341; 博主貓頭虎 帶您 Go to New World.?&#x1f341; &#x1f984; 博客首頁——貓頭虎的博客&#x1f390; &#x1f433;《面試題大全專欄》 文章圖文并茂&#x1f995;生動形象&#x1f996;簡單易學&#xff01;歡迎大家來踩踩~&#x1f33a; &a…

Linux權限系列--給普通用戶添加某個命令的sudo權限

原文網址&#xff1a;Linux權限系列--給普通用戶添加某個命令的sudo權限_IT利刃出鞘的博客-CSDN博客 簡介 說明 本文介紹Linux系統如何給普通用戶添加某個命令的sudo權限。 使用場景 普通開發者可能需要sudo的命令&#xff1a; apt-get&#xff08;經常要安裝軟件&#x…

【Vue2】---->VueX 3 核心概念

官網&#xff1a; Vuex 是什么&#xff1f; | Vuex (vuejs.org) 目錄 介紹 1、安裝 2、新建 store/index.js 專門存放 vuex 3、 在 main.js 中導入掛載到 Vue 實例上 核心概念 1、核心概念 -state 狀態 1、訪問Vuex中的數據 2、通過$store訪問的語法 3、通過輔助函…

Java IO流(一)IO基礎

概述 IO流本質 I/O表示Input/Output,即數據傳輸過程中的輸入/輸出,并且輸入和輸出都是相對于內存來講Java IO(輸入/輸出)流是Java用于處理數據讀取和寫入的關鍵組件常見的I|O介質包括 文件(輸入|輸出)網絡(輸入|輸出)鍵盤(輸出)顯示器(輸出)使用場景 文件拷貝&#xff08;File&…

Python自帶的IDLE有什么用

在Python的官方解釋器中&#xff0c;自帶了一個名為IDLE(Interactive DeveLopment Environment)的集成開發環境。 一、簡化代碼調試過程 很多初學者在編寫Python代碼時&#xff0c;經常會遇到一些問題需要調試。而在IDLE中&#xff0c;我們可以通過設置斷點、單步調試等方法&…

算法競賽入門【碼蹄集新手村600題】(MT1160-1180)C語言

算法競賽入門【碼蹄集新手村600題】(MT1160-1180&#xff09;C語言 目錄MT1161 N的零MT1162 數組最大公約數MT1163 孿生質數MT1164 最大數字MT1165 卡羅爾數MT1166 自守數MT1167自守數IIMT1168 階乘數MT1169 平衡數MT1170 四葉玫瑰數MT1171 幻數MT1172 完美數字MT1173 魔數MT11…

es線上處理命令記錄

常用命令 搜索 GET _search {"query": {"match_all": {}} }獲取全部模版 GET _index_template GET _index_template/yst_crawler_template獲取全部索引 GET /_cat/indices?v 獲取當前mapping GET /yst_crawler/_mapping創建一個mapping PUT /yst_c…

WebGL游戲站優化實錄【myshmup.com】

myshmup.com 允許在瀏覽器中創建 shmup&#xff08;射擊&#xff09;游戲。 你可以使用具有創意通用許可證的資源或上傳自己的藝術作品和聲音。 創建的游戲可以在網站上發布。 該平臺不需要編碼&#xff0c;游戲對象的配置是在用戶界面的幫助下執行的。 后端是使用Django框架開…

機器學習筆記 - 使用 ResNet-50 和余弦相似度的基于圖像的推薦系統

一、簡述 這里的代碼主要是基于圖像的推薦系統,該系統利用 ResNet-50 深度學習模型作為特征提取器,并采用余弦相似度來查找給定輸入圖像的最相似嵌入。 該系統旨在根據所提供圖像的視覺內容為用戶提供個性化推薦。 二、所需環境 Python 3.x tensorflow ==2.5.0 numpy==1.21.…

星際爭霸之小霸王之小蜜蜂(三)--重構模塊

目錄 前言 一、為什么要重構模塊 二、創建game_functions 三、創建update_screen() 四、修改alien_invasion模塊 五、課后思考 總結 前言 前兩天我們已經成功創建了窗口&#xff0c;并將小蜜蜂放在窗口的最下方中間位置&#xff0c;本來以為今天將學習控制小蜜蜂&#xff0c;結…

GPT-4一紙重洗:從97.6%降至2.4%的巨大挑戰

斯坦福大學和加州大學伯克利分校合作進行的一項 “How Is ChatGPTs Behavior Changing Over Time?” 研究表明&#xff0c;隨著時間的推移&#xff0c;GPT-4 的響應能力非但沒有提高&#xff0c;反而隨著語言模型的進一步更新而變得更糟糕。 研究小組評估了 2023 年 3 月和 20…

win10安裝mysql和c++讀取調用舉例

一、下載mysql8.rar解壓到C盤(也可以解壓到其他位置) 在系統環境變量添加JAVA_HOMEC:\myslq8&#xff0c;并在path中添加%JAVA_HOME%\bin; 二、以管理員身份進入命令窗口 三、修改配置文件指定安裝路徑和數據庫的存放路徑 四、鍵入如下命令初始化并啟動mysql服務,然后修改登錄…

Rust之泛型、trait與生命周期

泛型是具體類型或其他屬性的抽象替代。在編寫代碼時&#xff0c;可以直接描述泛型的行為&#xff0c;或者它與其他泛型產生的聯系&#xff0c;而無須知曉它在編譯和運行代碼時采用的具體類型。 1、泛型數據類型&#xff1a; 們可以在聲明函數簽名或結構體等元素時使用泛型&am…

TDD(測試驅動開發)?

01、前言 很早之前&#xff0c;曾在網絡上見到過 TDD 這 3 個大寫的英文字母&#xff0c;它是 Test Driven Development 這三個單詞的縮寫&#xff0c;也就是“測試驅動開發”的意思——聽起來很不錯的一種理念。 其理念主要是確保兩件事&#xff1a; 確保所有的需求都能被照…