direct2d基於windows窗體,因此必須了解一些基本的windows窗體程式設計:
首先,最基本的,可以使用windows api寫乙個窗體:
view code
#include typedef lresult (*message_callback)(hwnd, wparam, lparam);然後,加入atl庫後,窗體程式設計的事件過程可以簡化很多:struct
message_handler
;static message_handler s_handlers =
}, }
};int __stdcall wwinmain(hinstance module, hinstance, pwstr, int);
wc.style = cs_hredraw |cs_vredraw;
wc.hcursor =loadcursor(nullptr, idc_arrow);
wc.hinstance =module;
wc.lpszclassname = l"
window";
wc.lpfnwndproc = (hwnd window, uint message, wparam wparam, lparam lparam) ->lresult
}return
defwindowproc(window, message, wparam, lparam);
};registerclass(&wc);
auto hwnd = createwindow(wc.lpszclassname, l"
title
cw_usedefault, cw_usedefault, cw_usedefault, cw_usedefault,
nullptr, nullptr, module, nullptr);
msg message;
bool result;
while (result = getmessage(&message, 0, 0, 0
)) }}
view code
#include #include要加入d2d1,需要引入com元件,然而,com比較複雜,微軟引用wrl來簡化com的一些引用計數之類的操作,以下是乙個基本的d2d1示例(顯示乙個帶顏色的窗體):#include
struct
samplewindow :
cwindowimpl
declare_wnd_class_ex(l
"window
", cs_hredraw | cs_vredraw, -1
); begin_msg_map(samplewindow)
message_handler(wm_paint, painthandler)
message_handler(wm_destroy, destroyhandler)
end_msg_map()
lresult painthandler(uint, wparam, lparam, bool&)
lresult destroyhandler(uint, wparam, lparam, bool&)
};int __stdcall wwinmain(hinstance, hinstance, pwstr, int
) }
}
view code
#include "不得不說的是,這些示例和我原來在網上和書上看到的很不一樣,感覺他寫的更加優雅,通過他的講解,可以很容易理解。precompiled.h
"#include
#include
#pragma comment(lib, "d2d1")
using
namespace
d2d1;
using
namespace
microsoft::wrl;
struct
samplewindow
: cwindowimpl
comptr
m_factory;
comptr
m_target;
declare_wnd_class_ex(l
"my d2d1 window
", cs_hredraw | cs_vredraw, -1
); begin_msg_map(samplewindow)
message_handler(wm_paint, painthandler)
message_handler(wm_destroy, destroyhandler)
message_handler(wm_size, sizehandler)
message_handler(wm_displaychange, displaychangehandler)
end_msg_map()
lresult displaychangehandler(uint, wparam, lparam, bool&)
lresult sizehandler(uint, wparam, lparam lparam, bool&)
}return0;
}lresult painthandler(uint, wparam, lparam, bool&)
lresult destroyhandler(uint, wparam, lparam, bool&)
void
invalidate()
void
create()
;#ifdef debug
fo.debuglevel =d2d1_debug_level_information;
#endif
d2d1createfactory(d2d1_factory_type_single_threaded,
fo,
m_factory.getaddressof());
createdeviceindependentresources();
verify(__super::create(nullptr,
0, l"
title
"));
}void
createdeviceindependentresources()
void
createdeviceresources()
void
render()
if (!(m_target->checkwindowstate() &d2d1_window_state_occluded))}}
void
draw()
};int __stdcall wwinmain(hinstance, hinstance, pwstr, int
) }
}
more content at direct2d fundamentals
windows不規則窗體的程式設計實現
一 序言 二 實現原理 所有的 windows 窗體都位於乙個稱為 region 中,窗體的大小如果超出 region 的範圍,windows 會自動裁剪超出 region 範圍那部分的窗體,使其不可見。所以,要建立不規則窗體有兩個步驟 第一步就是建立不規則 region 第二步就是將窗體放到建立的...
Windows 程式設計基礎(三)
實現messageboxprintf函式,該函式有許多引數並能像 printf 那樣編排它們的格式。include include include int cdecl messageboxprintf tchar szcaption,tchar szformat,va list parglist v...
Windows 中不規則窗體的程式設計實現
一 序言 二 實現原理 所有的 windows 窗體都位於乙個稱為 region 中,窗體的大小如果超出 region 的範圍,windows 會自動裁剪超出 region 範圍那部分的窗體,使其不可見。所以,要建立不規則窗體有兩個步驟 第一步就是建立不規則 region 第二步就是將窗體放到建立的...