日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

createdroptargets_使用DUILIB建立项目

發布時間:2024/9/27 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 createdroptargets_使用DUILIB建立项目 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

使用DUILIB加載XML界面

這篇主要目的就是教給大家怎樣在自己的工程中加載XML界面,這是最基本的應用,對于界面控件響應啥的,我就不講了,在大家懂了這個之后,我會給大家一個其它人寫的博客,再看他的文章,大家應該就更清楚明白

一,建立工程

建立win32應用程序,取名叫blog_try

這里有幾點要注意:

1、選擇.net framework 2.0 如果你在開發時沒有選擇這個,而你用了默認的3.5的話,當你發布APP的時候,你就只有哭了,因為,3.5以上的只能在WIN 7上的操作系統運行,這一點一定要注意。我有血的教訓!!!

2、其它其實也沒什么注意的了,選擇win32下的win32項目

這里選擇:windows應用程序

二、搭環境

1、刪除部分生成的代碼

到blog_try里,把自動生成的代碼刪成這個樣子,即除了包含頭文件和winmain函數以外,其它都不要

2、復制duilib相關文件到工程目錄

2.1、把duilib源工程中的頭文件全部復制到我們的blog_try工程目錄下:

2.2、將lib文件同樣放在blog_try工程目錄下

2.3、將dll文件放在debug目錄下

三、函數重寫與加載界面文件

1、在stdafx.h中加入以下代碼,以添加包含duilib的頭文件和庫文件

//?TODO:?在此處引用程序需要的其他頭文件

#include?"UIlib.h"

using?namespace?DuiLib;

#ifdef?_DEBUG

#???ifdef?_UNICODE

#???????pragma?comment(lib,?"DuiLib_ud.lib")

#???else

#???????pragma?comment(lib,?"DuiLib_d.lib")

#???endif

#else

#???ifdef?_UNICODE

#???????pragma?comment(lib,?"DuiLib_u.lib")

#???else

#???????pragma?comment(lib,?"DuiLib.lib")

#???endif

#endif

2、在blog_try.h中添加類CMainFrame,這個類繼承自CwindowWnd,INotifyUI,我們也就是用這個類CMainFrame來實現綁定XML,添加對按鈕等等控件的響應。

class?CMainFrame?:

public?DuiLib::CWindowWnd,public?INotifyUI//應用程序窗口類CWindowWnd

{

public:

CMainFrame(void);

~CMainFrame(void);

};

在blog_try.cpp中添加實現

CMainFrame::CMainFrame(void)

{

}

CMainFrame::~CMainFrame(void)

{

}

現在blog_try.cpp中的代碼應該是:

3、重寫虛函數

在新實現的類中,有三個虛函數是必須重寫的,它們是:

LPCTSTR?GetWindowClassName()?const?{}??//這是個純虛函數,大家看UIBase.cpp里對它的引用就可以明白為什么非要實現它,因為

//在注冊窗口類時所用的類名(classname),就是用GetWindowClassName()來獲取的;

//與此類似地,大家可以通過重寫UINT?GetClassStyle()?const?{}來為注冊窗口類時,指定//類別,在360Demo中重寫了這個函數,大家可以去看看

void?Notify(TNotifyUI&?msg){}?????????//在新類中可以通過實現該類,來實現消息攔截,從而當指定的消息出現時,響應我們的函數

//這個函數主要用來處理窗口上的控件發出來消息的響應

LRESULT?HandleMessage(UINT?uMsg,?WPARAM?wParam,?LPARAM?lParam){}??//消息處理函數,這個主要用來處理對話框窗口產生的消息

首先是對GetWindowClassName()的重寫,即返回任意一個字符串做為注冊類的類名就可以了

代碼如下:

LPCTSTR?CMainFrame::GetWindowClassName()?const?//重寫獲取類名函數,也就是指定要新建的窗口類的類名

{

return?_T("UIMainFrame");

};

然后是對Notify的重寫

代碼如下:

void?CMainFrame::OnPrepare()

{

}

void?CMainFrame::Notify(TNotifyUI&?msg)//處理窗口通知消息,響應用戶的輸入

{

if(?msg.sType?==?_T("windowinit")?)?OnPrepare();

}

最后是對HandleMessage()的重寫:

3.1 先定義一個變量

CPaintManagerUI?m_pm;

這個變量將用來繪圖,即畫出我們圖像中的各種控件與背景的,從它的類型名CPaintManagerUI也能看得出來

3.2實現HandleMessage(){}

LRESULT?CMainFrame::OnCreate(UINT?uMsg,?WPARAM?wParam,?LPARAM?lParam,?BOOL&?bHandled){

LONG?styleValue?=?::GetWindowLong(*this,?GWL_STYLE);

styleValue?&=?~WS_CAPTION;

::SetWindowLong(*this,?GWL_STYLE,?styleValue?|?WS_CLIPSIBLINGS?|?WS_CLIPCHILDREN);

m_pm.Init(m_hWnd);//主窗口類與窗口句柄關聯

CDialogBuilder?builder;

CControlUI*?pRoot?=?builder.Create(_T("UISkin.xml"),?(UINT)0,?NULL,?&m_pm);//加載XML并動態創建界面無素,與布局界面元素,核心函數單獨分析

//注意:CDialogBuilder?并不是一個對話框類

ASSERT(pRoot?&&?"Failed?to?parse?XML");

if?(NULL==pRoot)//如果找不到皮膚文件則退出

{

MessageBox(NULL,TEXT("Cant?not?find?the?skin!"),NULL,MB_ICONHAND);

return?0;

}

m_pm.AttachDialog(pRoot);//附加控件數據到HASH表中……為pRoot作為對話框結點,為其創建控件樹

m_pm.AddNotifier(this);//增加通知處理

return?0;

}

LRESULT?CMainFrame::HandleMessage(UINT?uMsg,?WPARAM?wParam,?LPARAM?lParam)

{

LRESULT?lRes?=?0;

BOOL?bHandled?=?TRUE;

switch(?uMsg?)?{

case?WM_CREATE:

lRes?=?OnCreate(uMsg,?wParam,?lParam,?bHandled);

break;

default:

bHandled?=?FALSE;

}

if(?bHandled?)?return?lRes;

if(?m_pm.MessageHandler(uMsg,?wParam,?lParam,?lRes)?)?return?lRes;

return?CWindowWnd::HandleMessage(uMsg,?wParam,?lParam);

}

4、實現主函數WinMain()

int?APIENTRY?_tWinMain(HINSTANCE?hInstance,

HINSTANCE?hPrevInstance,

LPTSTR????lpCmdLine,

int???????nCmdShow)

{

CPaintManagerUI::SetInstance(hInstance);//設置程序實例

CPaintManagerUI::SetResourcePath(CPaintManagerUI::GetInstancePath()

+?_T("skin"));//實例句柄與渲染類關聯,獲得皮膚文件目錄(加載皮膚文件在OnCreate之中)

HRESULT?Hr?=?::CoInitialize(NULL);//初始化COM庫,?為加載COM庫提供支持

if(?FAILED(Hr)?)

return?0;

CMainFrame*?pMainFrame?=?new?CMainFrame();//創建應用程序窗口類對象

if(?pMainFrame?==?NULL?)

return?0;

pMainFrame->Create(NULL,?_T("AdderCalc"),?UI_WNDSTYLE_DIALOG,?0);

pMainFrame->CenterWindow();//將窗口放到桌面中央

pMainFrame->ShowWindow(true);//顯示窗口

CPaintManagerUI::MessageLoop();//進入消息循環

::CoUninitialize();//退出程序并釋放COM庫

return?0;

}

出錯及處理:

一、IDropTarget*?GetTxDropTarget();

提出錯誤:error C2143: 語法錯誤: 缺少“;”(在“*”的前面)

解決:添加頭文件:#include "OLEIDL.h"

總結

以上是生活随笔為你收集整理的createdroptargets_使用DUILIB建立项目的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。