1. 程式人生 > >ActiveX控制元件之製作圖片屬性頁

ActiveX控制元件之製作圖片屬性頁


本例可以通過屬性頁設定你的圖片(IPictureDisp)型別的屬性

1.新增Picture屬性(get/set methods,LPPICTUREDISP型別),新增成員變數CPictureHolder m_pic;

LPPICTUREDISP CToppCtrl::GetPicture()
{
    // TODO: Add your property handler here
    return m_pic.GetPictureDispatch();
    return NULL;
}

void CToppCtrl::SetPicture(LPPICTUREDISP newValue)
{
    // TODO: Add your property handler here
    m_pic.SetPictureDispatch(newValue);
    InvalidateControl();
    SetModifiedFlag();
}

2.修改OnDraw

void CToppCtrl::OnDraw(
            CDC* pdc, const CRect& rcBounds, const CRect& rcInvalid)
{
    // TODO: Replace the following code with your own drawing code.
    pdc->FillRect(&rcBounds, &CBrush(TranslateColor(m_color)));
    m_pic.Render(pdc, rcBounds, rcBounds);
    int nhei = 18;
    int y = 2;
    for(int i=0; i<m_saItems.GetSize(); i++, y+=nhei){
        CRect rect(rcBounds.left + 4, y+2, rcBounds.right - 4, y + nhei);
        pdc->FillRect(&rect, &CBrush(RGB(255, 255, 255)));
        pdc->TextOut(rcBounds.left + 4, y + 2, m_saItems[i]);
    }
}

3.修改DoPropExchange,新增"Picture"屬性的持久化
void CToppCtrl::DoPropExchange(CPropExchange* pPX)
{
    ExchangeVersion(pPX, MAKELONG(_wVerMinor, _wVerMajor));
    COleControl::DoPropExchange(pPX);

    // TODO: Call PX_ functions for each persistent custom property.
    PX_Color(pPX, "Color", m_color, TranslateColor(RGB(0, 0, 0)));
    PX_Picture(pPX, _T("Picture"), m_pic);
    PX_Items(pPX);
}

4.新建一對話方塊資源(OlePropertyPage型別,IDD_PROPPAGE_MYPIC),在上面新增兩按鈕("瀏覽","清除"),用 ClassWizard建立CMyPicPropPage(派生自COlePropertyPage),以後就開始編輯CMyPicPropPage這個 屬性頁類了。

5.新建字串資源IDS_MYPIC_PPG_CAPTION("圖片"),將之填入以下兩處,作為屬性頁打進標題(更改屬性頁的標題,就是簡單的更改相應字串資源的文字就可以了)
CMyPicPropPage::CMyPicPropPage() :
    COlePropertyPage(IDD, IDS_MYPIC_PPG_CAPTION

)
{
    //{{AFX_DATA_INIT(CMyPicPropPage)
    // NOTE: ClassWizard will add member initialization here
    //    DO NOT EDIT what you see in these blocks of generated code !
    //}}AFX_DATA_INIT
}

BOOL CMyPicPropPage::CMyPicPropPageFactory::UpdateRegistry(BOOL bRegister)
{
    // TODO: Define string resource for page type; replace '0' below with ID.

    if (bRegister)
        return AfxOleRegisterPropertyPageClass(AfxGetInstanceHandle(),
            m_clsid, IDS_MYPIC_PPG_CAPTION
);
    else
        return AfxOleUnregisterClass(m_clsid, NULL);
}

6.為CMyPicPropPage新增成員CPictureHolder m_pic,用來儲存屬性頁中的圖片(IPictureDisp)物件

7.新增兩個按鈕的響應函式,在OnButtonBrowser建立圖片物件(IPictureDisp),並儲存在m_pic中,在OnButtonClear中則刪除圖片物件。

void CMyPicPropPage::OnButtonBrowser()
{
    // TODO: Add your control notification handler code here
    CFileDialog dlg(TRUE, "所有檔案|*.*||");
    if(dlg.DoModal() == IDOK){
        CFile file;
        if(file.Open(dlg.GetPathName(), CFile::typeBinary | CFile::modeRead)){
            DWORD dwlen = file.GetLength();
            HGLOBAL hMem = GlobalAlloc(GMEM_FIXED, dwlen);
            file.Read((void*)hMem, dwlen);
            file.Close();
            LPSTREAM pstream;
            CreateStreamOnHGlobal(hMem, TRUE, &pstream);
            LPPICTUREDISP ppic = NULL;
            OleLoadPicture(pstream, dwlen, TRUE, IID_IPictureDisp, (LPVOID*)&ppic);
            if(ppic){
                m_pic.SetPictureDispatch(ppic);
            }
            GlobalFree(hMem);
        }
    }
/*    //需要#include "afxpriv2.h"
    CFileDialog dlg(TRUE, "所有檔案|*.*||");
    if(dlg.DoModal() == IDOK){
        CFile file;
        if(file.Open(dlg.GetPathName(), CFile::typeBinary | CFile::modeRead)){
            DWORD dwlen = file.GetLength();
            CArchive ar(&file, CArchive::load);
            CArchiveStream stm(&ar);
            LPSTREAM pstream = (LPSTREAM)&stm;
            LPPICTUREDISP ppic = NULL;
            OleLoadPicture(pstream, dwlen, TRUE, IID_IPictureDisp, (LPVOID*)&ppic);
            if(ppic){
                m_pic.SetPictureDispatch(ppic);
            }
            ar.Close();
            file.Close();
        }
    }*/
}

void CMyPicPropPage::OnButtonClear()
{
    // TODO: Add your control notification handler code here
    m_pic.CreateEmpty();
}

8.新增WM_PAINT訊息響應函式,以在屬性頁上顯示所選的圖片

void CMyPicPropPage::OnPaint()
{
    CPaintDC dc(this); // device context for painting
   
    // TODO: Add your message handler code here
    CRect rect;
    GetClientRect(&rect);
    rect.DeflateRect(10, 10, 200, 10);
    m_pic.Render(&dc, rect, rect);
    // Do not call COlePropertyPage::OnPaint() for painting messages
}

9.和控制元件產生關聯,在適當的時候載入控制元件的Picture屬性到m_pic在和儲存m_pic中的圖片到控制元件的Picture屬性:

void CMyPicPropPage::DoDataExchange(CDataExchange* pDX)
{
    // NOTE: ClassWizard will add DDP, DDX, and DDV calls here
    //    DO NOT EDIT what you see in these blocks of generated code !
    //{{AFX_DATA_MAP(CMyPicPropPage)
    //}}AFX_DATA_MAP
    if(pDX->m_bSaveAndValidate){
        SetPic();
    }
    else{
        GetPic();
    }
    DDP_PostProcessing(pDX);
}

void CMyPicPropPage::SetPic()
{
    USES_CONVERSION;
    COleDispatchDriver PropDispDriver;
    ULONG nObjects = 0;
    LPDISPATCH* ppDisp = GetObjectArray(&nObjects);

    DISPID dwDispID;
    LPCOLESTR lpOleStr = T2COLE("Picture");
    ppDisp[0]->GetIDsOfNames(IID_NULL, (LPOLESTR*)&lpOleStr, 1, 0, &dwDispID);

    PropDispDriver.AttachDispatch(ppDisp[0]);
    PropDispDriver.SetProperty(dwDispID, VT_DISPATCH, m_pic.GetPictureDispatch());
    PropDispDriver.DetachDispatch();
}

void CMyPicPropPage::GetPic()
{
    USES_CONVERSION;
    COleDispatchDriver PropDispDriver;
    ULONG nObjects = 0;
    LPDISPATCH* ppDisp = GetObjectArray(&nObjects);
    DISPID dwDispID;
    LPCOLESTR lpOleStr = T2COLE("Picture");
    ppDisp[0]->GetIDsOfNames(IID_NULL, (LPOLESTR*)&lpOleStr, 1, 0, &dwDispID);

    LPPICTUREDISP ppic = NULL;
    PropDispDriver.AttachDispatch(ppDisp[0]);
    PropDispDriver.GetProperty(dwDispID, VT_DISPATCH, (void*)&ppic);
    PropDispDriver.DetachDispatch();
    m_pic.SetPictureDispatch(ppic);
}

10.差點忘了一步了,因為是新建了一個屬性頁,不是用預設的屬性頁,所以得告訴控制元件,你有了哪兩個屬性頁了。
// TODO: Add more property pages as needed.  Remember to increase the count!
BEGIN_PROPPAGEIDS(CToppCtrl, 2)
    PROPPAGEID(CToppPropPage::guid)
    PROPPAGEID(CMyPicPropPage::guid)
END_PROPPAGEIDS(CToppCtrl)

11.可以編譯執行進行測試了

剛知道可以插入圖片,試試

相關推薦

ActiveX控制元件製作圖片屬性

本例可以通過屬性頁設定你的圖片(IPictureDisp)型別的屬性 1.新增Picture屬性(get/set methods,LPPICTUREDISP型別),新增成員變數CPictureHolder m_pic; LPPICTUREDISP CToppCtrl::G

Android自定義控制元件區域性圖片放大鏡--BiggerView

零、前言: 本文的知識點一覽 1.自定義控制元件及自定義屬性的寫法,你也將對onMesure有更深的認識 2.關於bitmap的簡單處理,及canvas區域裁剪 3.本文會實現兩個自定義控制元件:FitImageView(圖片自適應)和BiggerView(放大鏡),前者為後者作為鋪墊。 4.最後會

伺服器控制元件的onClick屬性

在之前的學習中,對於Html中的標籤中的onClick屬性,都是呼叫的是js中的方法,相應的,在html標籤中也是可以使用後臺程式碼中的方法的。    Login.aspx:  <asp:But

【Android 開發】:UI控制元件 ImageSwitcher 圖片切換控制元件的使用

1. ImageSwitcher 概要 1). ImageSwitcher 控制元件可以用在不同的影象之間切換,其中切換的過程可以採用動畫的方法,如淡入淡出的效果。 2). ImageSwitcher 需要一個影象工廠(ViewFactory)來建立用於顯示影象的Ima

C 圖片控制元件(PictureBox 常用屬性

BorderStyle:emun型,none表示無邊框;FixedSingle表示單線邊框;Fixed3D表示立體邊框。Image:在PictureBox上顯示的圖片,可在程式執行時用Image.FromFile函式載入SizeMode:emun型,表示圖片大小的顯示模式:    Normal表示影象被置於空

C#圖片控制元件(PictureBox)常用屬性

BorderStyle:emun型,none表示無邊框;FixedSingle表示單線邊框;Fixed3D表示立體邊框。 Image:在PictureBox上顯示的圖片,可在程式執行時用Image.FromFile函式載入 SizeMode:emun型,表示圖片大小的顯示模

MFC 的ActiveX控制元件開發(屬性

屬性頁 屬性頁使 ActiveX 控制元件使用者得以檢視和更改 ActiveX 控制元件屬性。可通過呼叫控制元件屬性對話方塊訪問這些屬性。該對話方塊包含一個或多個屬性頁,這些屬性頁提供自定義的圖形介面用於檢視和編輯控制元件屬性。 使用預設屬性頁 建立ActiveX控制元件專

使用Delphi,顯示ActiveX控制元件屬性方法

unit Unit1;interfaceuses  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,  Dialogs, OleCtrls, MSCommLib_TLB, St

Qt ActiveX控制元件跑官方例程記錄

目錄(?)[-] 開發環境 基礎知識瞭解 QT的ActiveX控制元件形式 in-process執行的ActiveX server控制元件 獨立執行的ActiveX server控制元件 開發環境 win7 64+QT

wpf自定義控制元件依賴屬性

  在wpf開發過程中,總會用到格式各樣的控制元件,但是原生控制元件遠遠不能滿足實際開發的需要,這時候wpf強大之處就能體現出來了。根據實際需求自定義各種不同的控制元件滿足不同的業務需求。 首先說需求吧: 一:根據某個bool值,控制一個圓形控制元件顯示或者不顯示某種顏色。 分析: 一:需

上的ActiveX控制元件和本上的其他部分的互動可能不安全的解決辦法

寫在前面 最近的專案需要在Windows IE瀏覽器中進行互動操作,每次都會彈出“此頁上的ActiveX控制元件和本頁上的其他部分的互動可能不安全”的提示,詢問是否允許這種互動。雖是windows系統的一種保護機制,可以給互動帶來了麻煩。試過網上其他更改ie瀏覽

上傳控制元件選擇完圖片後將其立即顯示在面上(jquery ajax)

       最近做了一個個人部落格系統,在新增修改“博主資訊”功能中有一項選擇頭像,用過<input type="file" />控制元件的都知道,選擇完圖片之後顯示的只是檔案的名字,而我想將圖片顯示在頁面上,初步的想法是選擇完圖片後提交到後臺,然後返回圖片的

基於ActiveX 控制元件開發動態Web

  Web頁面的開發主要分為三類:靜態Web頁面、半動態Web頁面以及Client端動態頁面。本文重點論述基於ActiveX Control(控制元件)動態實時頁面的開發。   ActiveX控制元件用於Web的過程是將控制元件嵌入主頁中,使用者通過瀏覽器訪問該主頁時,將主頁中的控制元件下載,並在使用者機器上

【React Native開發】React Native控制元件Image元件講解與美團首頂部效果例項(10)

轉載請標明出處:(一)前言        【好訊息】個人網站已經上線執行,後面部落格以及技術乾貨等精彩文章會同步更新,請大家關注收藏:http://www.lcode.org      今天我們一起來看一下Image元件的相關使用講解以及模仿實現一下美團首頁頂部分類的效果。具體環境搭建以及相關配置的請檢視之前

阻止IE彈出“在此上的 ActiveX 控制元件和本上的其他部份的互動可能不安全。你想允許這種互動嗎?”對話方塊

//在包含DllRegisterServer和DllUnregisterServer函式的cpp檔案中加入以下程式碼 //加入一個新的標頭檔案 #include <ObjSafe.h> //以下GUID為為當前使用的元件的GUID const GUID CDE

MFC在VS2010中為ActiveX控制元件新增屬性

ActiveX控制元件有四種屬性: (1)Stock:為每個控制元件提供的標準屬性,如字型或顏色。 (2)Ambient:圍繞控制元件的環境屬性——已被置入容器的屬性。這些屬性不能被更改,但控制元件可以使用它們調整自己的屬性。 (3)Extended:這些是由容器處

IOS開發控制元件載入背景圖片

設定一般View的背景 UIImageView *imgView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"back-568h"]];     imgView.frame = self.view

MFC的ActiveX控制元件開發(屬性)

屬性 屬性是 ActiveX 控制元件中向所有容器公開的資料成員。與事件和方法類似,也分為常用屬性和自定義屬性。 常用屬性 常用屬性已由 COleControl 類實現。COleControl 類包含支援控制元件的通用屬性的預定義成員函式。某些通用屬性包括控制元件的標題以及

VS2012下製作ActiveX控制元件並新增到網頁

為了節省時間,大部分資源取自http://www.cnblogs.com/li-peng/p/3455247.html,感謝作者。 流程概覽 1.建立ActiveX控制元件——按鈕 2.定義一個介面,並在控制元件中實現 3.部署安裝 4.CAB打包 5.新增到

Android進階——Material Design新控制元件TabLayout製作可滾動的Tabs頁面(二)

引言 上一篇總結講解了下TabLayout的基本特點、屬性和簡單的應用步驟,相信大家已經對於TabLayout已經不再陌生,這篇就結合Fragment+ViewPager的架構開發一個主流App的主要框架,進一步學習下TabLayout的操作和監聽,同時分享一