1. 程式人生 > >MFC 對話方塊(視窗)透明

MFC 對話方塊(視窗)透明

程式的實現步驟基本就是這樣,當然也有其他方法。希望大家能積極開拓,展示更多方法。

    SetWindowLong(this->GetSafeHwnd(), GWL_EXSTYLE, GetWindowLong(this->GetSafeHwnd(), GWL_EXSTYLE)^WS_EX_LAYERED);
#ifdef _UNICODE
    HINSTANCE hInst = LoadLibrary(_T("User32.DLL")); //顯式載入DLL
#else
    HINSTANCE hInst = LoadLibrary("User32.DLL"); //顯式載入DLL
#endif if (hInst) { typedef BOOL(WINAPI *MYFUNC) (HWND,COLORREF,BYTE,DWORD); MYFUNC fun = NULL; //取得SetLayeredWindowAttributes函式指標 fun=(MYFUNC)GetProcAddress(hInst, "SetLayeredWindowAttributes"); if (fun) fun(this->GetSafeHwnd(), RGB(255
, 255,255), 128, 1); //通過第三個引數來設定窗體透明程度 FreeLibrary(hInst); }
///建立背景刷
CBrush m_bkBrush;

HBRUSH CMyProgressCtrl2::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
    HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);

    // TODO:  Change any attributes of the DC here
    if(nCtlColor ==
CTLCOLOR_DLG) // 判斷是否是對話方塊 { return m_bkBrush; // 返回剛才建立的背景刷子 } if (nCtlColor==CTLCOLOR_STATIC && pWnd->GetDlgCtrlID()==IDC_STATIC_Percentage) { pDC->SetArcDirection(18); pDC->SetTextColor(RGB(0,0,0));///靜態文字框字型顏色 // return m_bkBrush; // 返回剛才建立的背景刷子 pDC->SetBkColor(RGB(255,255,255)); //靜態控制元件的背景顏色設定和視窗背景一樣,也會為透明,方法一 //pDC->SetBkMode(TRANSPARENT); //靜態文字框背景設定為透明,方法二 hbr=(HBRUSH)m_bkBrush; } else if (nCtlColor==CTLCOLOR_STATIC && pWnd->GetDlgCtrlID() == IDC_STATIC_Progress2)///也可以指定特定ID對應的控制元件 { pDC->SetArcDirection(18); return m_StaticBrush; // 返回剛才建立的背景刷子 } // TODO: Return a different brush if the default is not desired return hbr; }

不過處理後的透明效果都不是太好,控制元件邊界有一些毛刺

對重要一句話解釋:fun(this->GetSafeHwnd(), RGB(255, 255,255), 128, 1);
關於引數解釋點選原博主內容
下面是我複製過來的

使用SetLayeredWindowAttributes可以方便的製作透明窗體,此函式在w2k以上才支援,而且如果希望直接使用的話,可能需要下載最新的SDK。不過此函式在w2k的user32.dll裡有實現,所以如果你不希望下載巨大的sdk的話,可以直接使用GetProcAddress獲取該函式的指標。

以下是MSDN上的原內容,我會加以解釋。

The SetLayeredWindowAttributes function sets the opacity and transparency color key of a layered window.

BOOL SetLayeredWindowAttributes(
    HWND hwnd,
    COLORREF crKey,
    BYTE bAlpha,
    DWORD dwFlags
);
引數:

hwnd
[in] Handle to the layered window. A layered window is created by specifying WS_EX_LAYERED when creating the window with the CreateWindowEx function or by setting WS_EX_LAYERED via SetWindowLong after the window has been created.

crKey
[in] COLORREF structure that specifies the transparency color key to be used when composing the layered window. All pixels painted by the window in this color will be transparent. To generate a COLORREF, use the RGB macro.

bAlpha
[in] Alpha value used to describe the opacity of the layered window. Similar to the SourceConstantAlpha member of the BLENDFUNCTION structure. When bAlpha is 0, the window is completely transparent. When bAlpha is 255, the window is opaque.

dwFlags
[in] Specifies an action to take. This parameter can be one or more of the following values.
LWA_COLORKEY
Use crKey as the transparency color.
LWA_ALPHA
Use bAlpha to determine the opacity of the layered window.

Return Value

If the function succeeds, the return value is nonzero.
If the function fails, the return value is zero. To get extended error information, call GetLastError.

詳細解說

引數1、主要說的是所要設定的窗體必須是WS_EX_LAYERED格式,設定方法如下:

           //設定窗體為WS_EX_LAYERED格式

SetWindowLong(this->GetSafeHwnd(),GWL_EXSTYLE, 

GetWindowLong(this->GetSafeHwnd(),GWL_EXSTYLE)^0x80000);     

//其實0x80000 == WS_EX_LAYERED
引數1:視窗控制代碼

引數2:意思是可以設定指定的顏色為透明色,通過RGB巨集設定。

引數3:可以簡單的理解為窗體透明的程度範圍為0~2550為完全透明,255不透明)。需要引數4設定為2,這種情況下的透明是對視窗以及控制元件都進行處理。這個時候引數2無效。

引數4:可以取兩個值LWA_COLORKEY (0x1)和 LWA_ALPHA(0x2),如下:

    取值為LWA_ALPHA即等於2時,引數2無效,通過引數3決定透明度.

    取值為LWA_COLORKEY即等於1時,引數3無效,引數2指定的顏色為透明色,其他顏色則正常顯示,你可以在處理前先設定號視窗的背景顏色


把以下程式碼放OnInitDialog中即可實現半透明窗體

SetWindowLong(this->GetSafeHwnd(), GWL_EXSTYLE, 
    GetWindowLong(this->GetSafeHwnd(), GWL_EXSTYLE)^WS_EX_LAYERED);

HINSTANCE hInst = LoadLibrary("User32.DLL"); //顯式載入DLL
if (hInst) 
{            
    typedef BOOL(WINAPI *MYFUNC) (HWND,COLORREF,BYTE,DWORD);          
    MYFUNC fun = NULL;

    //取得SetLayeredWindowAttributes函式指標     
    fun=(MYFUNC)GetProcAddress(hInst, "SetLayeredWindowAttributes"); 
    if (fun)
        fun(this->GetSafeHwnd(), 0, 128, 2);     //通過第三個引數來設定窗體透明程度
    FreeLibrary(hInst); 
}

另外有一點需要注意的是:
要使使窗體擁有透明效果,首先要有WS_EX_LAYERED擴充套件屬性。
 函式原型:LONG
GetWindowLong(HWND hWnd;int nlndex);
 引數:
  hWnd:視窗控制代碼及間接給出的視窗所屬的視窗類。
  nlndex:指定要檢索的基於0的的偏移量。有效值的範圍從0到視窗額外記憶體空間的位元組數,最小為4。例如,若指定了12位或多於12位的窗體類的額外儲存空間,則應設為第三個32位整數的索引位8。要獲得任意其他值,指定下列值之一:
  GWL_EXSTYLE:獲得擴充套件視窗風格。
  GWL_STYLE:獲得視窗風格。
  GWL_WNDPROC:獲得視窗過程的地址,或代表視窗過程的地址的控制代碼。必須使用GWL_WNDPROC函式呼叫視窗過程。
  GWL_HINSTANCE:獲得應用事例的控制代碼。
  GWL_HWNDPAAENT:如果父視窗存在,獲得父視窗控制代碼。
  GWL_ID:獲得視窗標識。
  GWL_USERDATA:獲得與視窗有關的32位值。每一個視窗均有一個與這個視窗相關的給使用者使用的32位的資料。具體用途自定義。
  在hWnd引數標識了一個對話方塊時也可用下列值:
  DWL_DLGPROC:獲得對話方塊過程的地址,或一個代表對話方塊過程的地址的控制代碼。必須使用函式CallWindowProc來呼叫對話方塊過程。
  DWL_MSGRESULT:獲得在對話方塊過程中一個訊息處理的返回值。
  DWL_USER:獲得應用程式私有的額外資訊,例如一個控制代碼或指標。
 返回值:如果函式成功,返回值是所需的32位值;如果函式失敗,返回值是0。若想獲得更多錯誤資訊請呼叫 GetLastError函式。
 備註:通過使用函式RegisterClassEx將結構WNDCLASSEX中的cbWndExtra單元指定為一個非0值來保留額外類的儲存空間。

相關推薦

MFC 對話方塊視窗透明

程式的實現步驟基本就是這樣,當然也有其他方法。希望大家能積極開拓,展示更多方法。 SetWindowLong(this->GetSafeHwnd(), GWL_EXSTYLE, GetWindowLong(this->GetSafeHw

四種對話方塊dialog的簡單使用方法

有普通對話方塊,單選對話方塊,複選對話方塊,進度條的兩種實現方法話不多說,直接上程式碼 activity_main.xml:   1 <?xml version="1.0" encoding="utf-8"?> 2 <android.support.constra

Android中的對話方塊AlertDialog

建立android中分體式對話方塊需要四個步驟: 第一:獲得AlertDialog的靜態內部類Builder物件,有該類建立對話方塊。 第二:通過Builder物件設定對話方塊的標題,按鈕UI及將要響應的事件。、 第三:呼叫Builder的Create()方法建立對對話方塊 第四

android模式進度對話方塊ProgressDialog的呼叫方法

public class MainActivity extends AppCompatActivity {     @BindView(R.id.button2)     Button button2;     @BindView(R.id.button1)     TextView

PyQt5 筆記6 -- 對話方塊QDialog

PyQt5 筆記6 – 對話方塊(QDialog) 1、主視窗彈出對話方塊 import sys from PyQt5.QtWidgets import QApplication, QMainWin

GUI之練習——列出指定目錄下的內容和對話方塊Dialog

package myclass; import java.awt.; import java.awt.event.; import java.io.*; class MyWindowDemo { private Frame f; private TextFiel

android 實現點選輸入框彈出日期選擇對話方塊DatePickerDialog

前言 這裡我們實現一個功能,點選日期輸入框(EditText),即可彈出日期選擇對話方塊(DatePickerDialog),等使用者選擇日期後,將使用者選擇的日期顯示在日期輸入框。 1.activity_main.xml 這裡只有一個TextView和EditText。

Java-記事本程式、檔案選擇對話方塊JFileChooser

基本的GUI基礎和IO基礎 核心程式碼 JFileChooser jfc = new JFileChooser(); jfc.setDialogTitle("另存為..."); // jfc.showOpenDialog(null); // 顯示開啟檔案

對話方塊CDialog中使用分割窗CSplitterWnd

原文見:   可以使用以下三個步驟在對話方塊中建立分割窗: 1. In the OnCreate function or your CDialog, register a new WindowClass by calling "AfxRegisterWndClass".

VC++對話方塊CDialog新增背景圖片

在對話方塊(CDialog)程式中,為了讓程式看上去漂亮一些,我們可以為對話方塊新增一個好看的背景圖片,要想完成這個目標,可以利用afx_msg BOOLOnEraseBkgnd (CDC* pDC) 這個函式。 (1)找來一張合適的BMP格式的背景圖片,將其放在工程的r

androdi簡單的密碼輸入對話方塊Dialog

加入: compile 'com.flyco.dialog:FlycoDialog_Lib:[email protected]' Dialog程式碼: package com.influx.kalyke.component; /** * Created

jquery 對話方塊Dialog外掛

<!doctype html> <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <

VC++對話方塊CDialog的全屏顯示及控制元件居中顯示

在編寫一些軟體時,我們會比較偏向於比較簡潔、清新的使用者介面,同時為了避免其它程式或者桌面等影響使用者的注意力等,我們通常習慣將軟體介面全屏,佈滿整個顯示螢幕,與此同時,我們也將對介面中的控制元件位置進行相應的調整,讓它們按螢幕的大小和其在對話方塊中的相對位置,居中顯示。

win7訪問xp的共享,彈出重輸入密碼的對話方塊NTLM

最近在研究 NTLM 的東東,無意發現一博文,實乃 NTLM 應用之例項, 故轉之,再次感謝原創者! --------------------------------------------------------------------------------------

QT學習 之 對話方塊 字型對話方塊、訊息對話方塊、檔案對話方塊、程序對話方塊

QMessageBox類: 含有Question訊息框、Information訊息框、Warning訊息框和Critical訊息框等 通常有兩種方式可以來建立標準訊息對話方塊: 一種是採用“基於屬性”的API,一種是使用QMessageBox的靜態方法。 後者書寫容易,但缺

QT學習 之 對話方塊 可擴充套件對話方塊

QT中的對話方塊是QDialog類 下面是三個主要的視窗的區別: QWidget類是所有使用者介面物件的基類。 視窗部件是使用者介面的一個基本單元:它從視窗系統接收滑鼠、鍵盤和其它事件,並且在螢幕上繪製自己。每一個視窗部件都是矩形的,並且它們按Z軸順序排列。一個視窗部件可以

標準對話方塊QMessageBox

    所謂標準對話方塊,是 Qt 內建的一系列對話方塊,用於簡化開發。事實上,有很多對話方塊都是通用的,比如開啟檔案、設定顏色、列印設定等。這些對話方塊在所有程式中幾乎相同,因此沒有必要在每一個程式

android 8種對話方塊Dialog使用方法彙總

目錄 1.寫在前面2.程式碼示例 2.1 普通Dialog(圖1與圖2) 2.2 列表Dialog(圖3) 2.3 單選Dialog(圖4) 2.4 多選Dialog(圖5) 2.5 等待Dialog(圖6) 2.6 進度條Dialog(圖7) 2.7 編輯Dialog(圖8) 2.8 自定義Dialo

MFC對話方塊裡利用CHtmlView載入介面————分層視窗設定

        在學會了 利用CHtmlView 在MFC對話方塊上顯示網頁,並支援JavaScript 和 MFC 之間的互相通訊後。 當然就想: 我們為什麼不能只用HTML 作為前端介面, 而底層用MFC實現邏輯呢? 這樣就完全不需要用到MFC對話方塊的介面風格了。

CEF方面的研究 CEF嵌入MFC對話方塊關閉崩潰問題解決辦法

RT、相信有不少朋友在開發過程中都遇到了,關閉崩潰或者關閉後開啟電腦工作管理員,還有程序存在的問題。 這個問題把我也是快折騰瘋了,畢竟存在這類崩潰或者資源解除安裝不掉的問題是不能用入專案中的,蛋疼的困擾了我半個多月的時間,當我把後面的東西全部做完時,又不得不拐過頭來解決他,