1. 程式人生 > >Button控制元件的重繪

Button控制元件的重繪

  在用VC6.0編寫windows程式時,你是不是時常因為自己的介面不好看而自卑。從現在開始我就來嘗試著使我們的程式旋起來。 按鈕是我們編寫windows程式時不可缺少的控制元件之一。按一般使用者的理解,不管視窗是否為輸入焦點,當滑鼠(準確的說應該是游標cursor)劃過按鈕時,按鈕應該變色,表示這個地方是可以按下的。可是用VC6.0原始給出的按鈕像個傻瓜一樣,沒有絲毫反應。 其實要讓他有反應還是很簡單的,下面就是我們該做的。 1.派生一個類,其基類為CButton。假如叫:CMyButton 2.為該類新增WM_MOUSEMOVE訊息,message handle裡應該這樣寫:      void CMyButton::OnMouseMove(UINT nFlags, CPoint point) 
{
       
if(!m_bOverControl)
       
{
              m_bOverControl 
= TRUE;
              Invalidate();
              SetTimer(m_nTimerID, 
100, NULL);
       }

       
       CButton::OnMouseMove(nFlags, point);
}

m_bOverControl:通過名字就可以猜到他是一個布林變數,用來表示現在游標是否在按鈕上放。 Invalidate():強制使按鈕發生重繪。 SetTimer():設定一個定時器,定時檢查游標是否還在按鈕上方。 3.新增WM_TIMER訊息:message handle裡應該這樣寫:       void CMyButton::OnTimer(UINT nIDEvent) 
{
    CPoint p(GetMessagePos());
    CRect rc;
    ScreenToClient(
&p);
    
    GetClientRect(
&rc);
    
    
if(! rc.PtInRect(p))
    
{
        m_bOverControl 
= FALSE;
        KillTimer(m_nTimerID);
        Invalidate();
    }

    
    CButton::OnTimer(nIDEvent);
}

GetMessagePos():獲得上次訊息傳送時,游標的位置。如果要獲得當前游標的位置就要用GetCursorPos()。 4.過載基類的PreSubclassWindow。這個函式其實是在CWnd裡定義的。當控制元件子類化是由framework知道呼叫。我們常常在這個函式裡修改控制元件的style。在這裡我們要將控制元件改為自繪的。                
void CMyButton::PreSubclassWindow() 
{     
       CButton::PreSubclassWindow();
       
       ModifyStyle(
0, BS_OWNERDRAW);
}

5.最後,也是最重要的,就是具體的繪製操作。在這裡過載 void CMyButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)就可以了。具體如下:                   void CMyButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) 
{
       CDC 
*pDC = CDC::FromHandle(lpDrawItemStruct->hDC);
       CRect rc 
= lpDrawItemStruct->rcItem;
       UINT state 
= lpDrawItemStruct->itemState;
 
       CString text;
       GetWindowText(text);
 
       
if(state & ODS_SELECTED)
       
{
              pDC
->DrawFrameControl(rc, DFC_BUTTON, DFCS_BUTTONPUSH | DFCS_PUSHED);
       }

       
else
       
{
              pDC
->DrawFrameControl(rc , DFC_BUTTON, DFCS_BUTTONPUSH);
       }

 
    rc.DeflateRect( CSize(GetSystemMetrics(SM_CXEDGE), GetSystemMetrics(SM_CYEDGE)));
    
if (m_bOverControl)
        pDC
->FillSolidRect(rc, RGB(2552550)); // yellow
 
       
if(!text.IsEmpty())
       
{
              CSize size 
= pDC->GetTextExtent(text);
              CPoint pt(rc.CenterPoint().x
-size.cx/2, rc.CenterPoint().y - size.cy/2);
 
              
if(state & ODS_SELECTED)
                     pt.Offset(
11);
 
              
int mode = pDC->SetBkMode(TRANSPARENT);
              
if(state & ODS_DISABLED)
                     pDC
->DrawState(pt, size, text, DSS_DISABLED, TRUE, 0, (HBRUSH)NULL);
              
else
                     pDC
->TextOut(pt.x, pt.y, text);
 
              pDC
->SetBkMode(mode);
 
 
       }

}

 

相關推薦

C# GDI 控制元件

最近有個小需求,就是將checkbox選擇框畫大一點,網上找了點資料整理了下,程式碼如下。 using System; using System.Collections.Generic; using System.ComponentModel; using Syst

android控制元件

android中實現view的更新有兩組方法,一組是invalidate,另一組是postInvalidate,其中前者是在UI執行緒自身中使用,而後者在非UI執行緒中使用。 View的重繪——系統不會經常去呼叫View的OnDraw函式,為了能夠在View上實現動畫效果,

C#中ListBox控制元件Item項

一般情況下不需要手動重繪ListBox。 1、首先選中拖至面板的ListBox控制元件,點屬性,選中DrawMode,改成OwnerDrawFixed或OwnerDrawVariable2、還是在屬性工具中,切換到事件(就是那個閃電圖示),滑鼠雙擊‘行為’選單下的DrawI

Button控制元件

  在用VC6.0編寫windows程式時,你是不是時常因為自己的介面不好看而自卑。從現在開始我就來嘗試著使我們的程式旋起來。 按鈕是我們編寫windows程式時不可缺少的控制元件之一。按一般使用者的理解,不管視窗是否為輸入焦點,當滑鼠(準確的說應該是游標cursor)劃過按

WPF TabIndex預設樣式修改:去掉預設虛線框、自定義樣式(Button控制元件為例)

去掉Tab選中預設虛線框 Tab鍵切換時,被選控制元件自動存在虛線框,有時候為了介面美觀,這個虛線框就顯得比較麻煩。廢話不多說,下面是方法。 <Window.Resources> <Style x:Key="MeyFocusVisual" TargetType="{

Button控制元件的使用方法

Button控制元件的使用方法 Button控制元件的定義 private Button btn; btn = (Button)findViewById(R.id.button); //根據資源ID獲取view檢視 Button控制元件設定監聽函式 匿名內部類的形式 設定按

Android 關於佈局中Button控制元件正常順序出現的遮蓋其他控制元件問題

在一個相對佈局中設定著底部組合控制元件,比如:正常app的四個底部導航欄,分別用權重去等比例顯示,但是若在其中的一份比例中的相對佈局裡放置了Button和其他的自定義控制元件(包含非自定義控制元件),那麼就會出現Button覆蓋佈局中的其他控制元件的問題,不過遇到的也許不多吧

動態建立多個Button控制元件

實現效果:    知識運用:   Controls屬性  //獲取包含在窗體內的控制元件的集合     public Control.ControlCollection Controls { get; }   Controls集合的的Add方法  //將指定的控制元件新增到窗體控制元件的集合中  

WPF程式設計之自定義Button控制元件樣式

自.NET Framework 3.0 以後,WPF程式設計框架可使開發人員開發出更加令人耳目一新的桌面應用程式。它使開發工作更加方便快捷,它將設計人員和程式設計人員的工作分離開來。至於WPF的背景歷史、框架特點、框架結構這裡就不再贅述。有興趣的同袍可在百度搜索關於WPF的相

Android Button控制元件字母大小寫顯示問題

之前做開發時候,Button控制元件中的文字一般是中文,昨天做測試時候設定成英文後發現不管如何設定,手機上都顯示是大寫字母(其他控制元件沒有)。 btn.setText("aaa"); //顯示大寫AAA 在網上找到原因。 在控制元件中新增一條屬性。 androi

ASP.NET自定義Web伺服器控制元件-Button控制元件

using System; using System.Collections.Generic; using System.ComponentModel; using System.Linq; using System.Text; using System.Web; usin

WPF TabIndex預設樣式修改:去掉預設虛線框、自定義樣式(Button控制元件為例)

去掉Tab選中預設虛線框 Tab鍵切換時,被選控制元件自動存在虛線框,有時候為了介面美觀,這個虛線框就顯得比較麻煩。廢話不多說,下面是方法。 <Window.Resources> <Style x:Key="MeyFocusVisual" Tar

微信小程式學習(10)-button控制元件

button控制元件學習 1.button屬性 2.size和type屬性對button的影響 size屬性的預設值為default,type屬性的預設值也為default,如果值為default時,該屬性可以省略; <view class="content">

JS中button控制元件click事件無法響應的問題

                再點選登入按鈕時無法響應JS事件,後來發現button控制元件的id值和onclick中的方法名相

JS如何讓button控制元件單機後不能獲得焦點

問題 在頁面中設定了一個button按鈕,單機後瀏覽器預設將焦點加在該按鈕上,此時我們比如按下空格鍵,就會再一次觸發該按鈕 我們該如何解決呢? 方法1 //獲取該元素 const button = document.querySelector('button'); button.

cocos creator Button控制元件用法

Button控制元件用法比較簡單,從控制元件庫拖拽Button控制元件到場景編輯器中,我們看到Button裡自帶了一個label,我們不用的話,就直接將其刪除即可。 選中Button控制元件,在右側的屬性檢查器中,可以檢視Button的元件屬性 選擇相對應的圖片,然後在事

antd原始碼解析(二)button控制元件的解析

第一節我們看了antd的button原始碼,現在我們用class的常用寫法改造下: import React,{ Component } from "React"; var _classnames2 = require('classnames');

習題9:設計一個Windows應用程式,窗體上有一個TextBox控制元件、一個Button控制元件

設計一個Windows應用程式,窗體上有一個TextBox控制元件、一個Button控制元件。要求,每當使用者單擊按鈕時,文字框都會增加一行文字來反映單擊的次數,例如“第3次單擊按鈕”。 【解答】 1) 窗體介面如圖Ex5-5-1所示; 2) 窗體中主要控制元件屬性設

Lua筆記:Button控制元件按鈕建立及使用

--------------------------- Button控制元件按鈕使用 ----------------------------------------- --lua 中 B

用css樣式修改input控制元件button控制元件

input中的text submit button等和單獨button控制元件可以用css修改外觀 eg: <style> .item_submit {background-color:red;width:100px;height:50px;font-siz