6.24.2010

operator overwrite : conversion function

在WTL 的source code 看到:
operator HBITMAP() const { return m_hBitmap; }
所以不知道是哪一個 operator 被 overwrite。

有 HBITMAP 這個 operator 嗎?

的確,就是 conversion function

自動型別轉換.
CBitmap theBitmap;
HBITMAP hBitmap;

hBitmap = theBitmap; // 等於是 hBitmap = (HBITMAP)theBitmap;

這個就是 conversion
上面的 example 會讓 hBitmap = theBitmap.m_hBitmap;

... 好像也是為了好看...好吧,還有方便..

smart_ptr in WTL CBitmap

看到 WTL 的 AtlCopyBitmap ( ) 中,有:
CBitmap bmNew = NULL;
..
bmNew.CreateCompatibleBitmap( ..
覺得很奇怪。
所以看一下 CBitmap 的 implement (在 atlgdi.h),, 有這一段:
CBitmapT<t_bManaged>& operator =(HBITMAP hBitmap)
{
Attach(hBitmap);
return *this;
}

void Attach(HBITMAP hBitmap)
{
if(t_bManaged && m_hBitmap != NULL&& m_hBitmap != hBitmap)
::DeleteObject(m_hBitmap);
m_hBitmap = hBitmap;
}

HBITMAP Detach()
{
HBITMAP hBitmap = m_hBitmap;
m_hBitmap = NULL;
return hBitmap;
}

所以是 CBitmap overwrite 了 operator "="
配合 attach, detach 來看,這有點像 smart_ptr 的作法。... 雖然他是handle wrapper,不是 pointer wrapper..

typedef CBitmapT CBitmap;
true 代表 memory management 由 class 自己 handle。


所以那個 CBitmap bmNew = NULL 代表將 bmNew 的 member m_hBitmap 設為 NULL。
這應該只是為了好看吧..否則寫兩行也可以呀:
CBitmap bmNew;
bmNew.m_hBitmap = NULL;

6.23.2010

GDI - SelectObject

DC (Device Context) 是畫布
一堆 GDI 物件:Pen, Brush, Font, Bitmap, ..都是可以畫在畫布(DC)上的物件。


所以要用這些 GDI 畫圖時,要用 SelectObject(DC_A,Object_A) ,告訴kernel 我要 DC_A上用Object_A 畫圖了。

SelectObject( ) 會傳回那個 DC 原來的 Object 內容,讓你畫完後,可以 Select 回來原來物件。
例如原來是 12 點字,後來用 14 點字寫幾個字後,選回原來的 12點字


... 希望這個想法可以用....

6.17.2010

show progress bar when booting - CE

這一篇 說道如何作 開機動畫。

他的作法是在 CE driver 中作,他選 backlight driver。
-- 應該要把 backlight driver 放在前面一點。

在 backlight driver 啟動(Init or PowerOn ?)的時候 create 一個 thread,定時的 update lcd buffer。一直到 Stopflash 的 event 送達。

Stop event 可以由 shell 送出。代表開機完成了。


問題: Driver PowerUp/Down 時好像是 single thread,可以create thread 嗎?

auto_ptr

auto_ptr 是 smart_ptr 的一種。

利用 auto variable 在離開 scope 會自動被 delete 的特性。
讓 一般的 pointer variable 在 new object 後,也有這樣的特性。
這樣,就不必特地在 function return 前 手動 call delete 了。

參考 http://ootips.org/yonat/4dev/smart-pointers.html

原來 pointer 的寫法:
void foo()
{
MyClass* p(new MyClass);
p->DoSomething();
delete p;
}

改用 auto_ptr 後,可以這樣寫:
void foo()
{
auto_ptr<MyClass> p(new MyClass);
p->DoSomething();
}

針對 memory 管理這一點,auto_ptr 還提供一些其他的功能:
  • 指定;當一個 ptr = 另一個 ptr,原來 ptr 的 object 會先 delete 掉。
  • exception handling : 在所有動作作try-catch,這樣當 exception 時,還可以正常 free 掉 object

6.15.2010

Bookmark - Monte Carlo Profiler for CE 6.0 (MSDN)

http://msdn.microsoft.com/en-US/library/ee481579.aspx 這一篇 MSDN 有講 CE 6.0 Monte Carlo Profiler 的作法,可以試試看。

用 target control 下 prof 可以看到help

6.14.2010

WTL - request to send WM_PAINT message

WM_PAIN message 被送出的機會有:
  • OS 發現你的視窗區域需要重劃了,例如:被其他windows 蓋過,size 改變..
  • 你自己呼叫 function,叫 OS 送 message 給你
WTL 里要呼叫 Invalidate( ),實際上是 ATL implement 的,不是 WTL。
在 altwin.h 。
實際上他也是呼叫 InvalidateRect( ) 而已。


順便寫一下 CPaintDC

原本在 Win32SDK 中,要對 DC 作動作,都要 beginpaint, get xx 等一堆,然後畫完又要 endpaint.. etc.

CPaintDC 就把剛剛的動作包裝起來,在 constructor 中作 BeginPain,在Destrctor 作 EndPaint。

又 CPaintDC 繼承自 CDCT。

CDCT 是 WTL 把所有 Win32 的 DC 繪圖包裝起來的 class。
所以一旦生成 CPaintDC 後,就可以任意使用 DC繪圖 function 了。