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建立项目的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux sed 正则转义,Linux
- 下一篇: 【C语言基础】C语言异常捕获机制 - s