Windows基礎窗體程式設計

2022-01-12 08:40:27 字數 3456 閱讀 8201

direct2d基於windows窗體,因此必須了解一些基本的windows窗體程式設計:

首先,最基本的,可以使用windows api寫乙個窗體:

view code

#include typedef lresult (*message_callback)(hwnd, wparam, lparam);

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

)) }}

然後,加入atl庫後,窗體程式設計的事件過程可以簡化很多:

view code

#include #include 

#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

) }

}

要加入d2d1,需要引入com元件,然而,com比較複雜,微軟引用wrl來簡化com的一些引用計數之類的操作,以下是乙個基本的d2d1示例(顯示乙個帶顏色的窗體):

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 第二步就是將窗體放到建立的...