在 MDI 主From有背景圖的問題 for BCB |
答題得分者是:RaynorPao
|
Jeffrey_Chang
一般會員 發表:5 回覆:10 積分:3 註冊:2003-06-15 發送簡訊給我 |
我參考了Demo的程式並是圖改成BCB的形式, 但是compile仍出錯, 所以想請高手幫幫忙, 謝謝.
//-------------------------------------------------------------------
void __fastcall TMainForm::FormCreate(TObject *Sender)
{
FClientInstance = MakeObjectInstance(ClientWndProc);
FPrevClientProc = Pointer(GetWindowLong(ClientHandle, GWL_WNDPROC));
SetWindowLong(ClientHandle, GWL_WNDPROC, (Word)FClientInstance);
}
//-------------------------------------------------------------------
void __fastcall TMainForm::ClientWndProc(TMessage &Message)
{ HDC MyDC;
Word Ro, Co; if(Message.Msg == WM_ERASEBKGND) {
MyDC=((TWMEraseBkgnd&)Message).DC;
SetStretchBltMode (MyDC,COLORONCOLOR);
StretchBlt(MyDC, 0, 0, MainForm->ClientWidth,MainForm->ClientHeight,
MainImage->Picture->Bitmap->Canvas->Handle,
0, 0, MainImage->Picture->Width, MainImage->Picture->Height,
SRCCOPY);
Message.Result=1;
}
else
Message.Result=CallWindowProc(FPrevClientProc, ClientHandle, Message.Msg, Message.WParam, Message.LParam);
}
//-------------------------------------------------------------------
那個 Error 是
[C Error] WsuMain.cpp(78): E2034 Cannot convert 'void *' to 'int (__stdcall *)()'
[C Error] WsuMain.cpp(78): E2342 Type mismatch in parameter 'lpPrevWndFunc' (wanted 'int (__stdcall *)()', got 'void *') 我曾試圖 Remark error 的程式, 但卻無法秀出圖形且背景都壞了.
|
RaynorPao
版主 發表:139 回覆:3622 積分:7025 註冊:2002-08-12 發送簡訊給我 |
引言: 我參考了Demo的程式並是圖改成BCB的形式, 但是compile仍出錯, 所以想請高手幫幫忙, 謝謝. //------------------------------------------------------------------- void __fastcall TMainForm::FormCreate(TObject *Sender) { FClientInstance = MakeObjectInstance(ClientWndProc); FPrevClientProc = Pointer(GetWindowLong(ClientHandle, GWL_WNDPROC)); SetWindowLong(ClientHandle, GWL_WNDPROC, (Word)FClientInstance); } //------------------------------------------------------------------- void __fastcall TMainForm::ClientWndProc(TMessage &Message) { HDC MyDC; Word Ro, Co; if(Message.Msg == WM_ERASEBKGND) { MyDC=((TWMEraseBkgnd&)Message).DC; SetStretchBltMode (MyDC,COLORONCOLOR); StretchBlt(MyDC, 0, 0, MainForm->ClientWidth,MainForm->ClientHeight, MainImage->Picture->Bitmap->Canvas->Handle, 0, 0, MainImage->Picture->Width, MainImage->Picture->Height, SRCCOPY); Message.Result=1; } else Message.Result=CallWindowProc(FPrevClientProc, ClientHandle, Message.Msg, Message.WParam, Message.LParam); } //------------------------------------------------------------------- 那個 Error 是 [C Error] WsuMain.cpp(78): E2034 Cannot convert 'void *' to 'int (__stdcall *)()' [C Error] WsuMain.cpp(78): E2342 Type mismatch in parameter 'lpPrevWndFunc' (wanted 'int (__stdcall *)()', got 'void *') 我曾試圖 Remark error 的程式, 但卻無法秀出圖形且背景都壞了.Jeffrey_Chang 你好: 請參考以下連結文章,先解決 compile 的問題吧
------
-- 若您已經得到滿意的答覆,請適時結案!! -- -- 欲知前世因,今生受者是;欲知來世果,今生做者是 -- -- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 -- |
Jeffrey_Chang
一般會員 發表:5 回覆:10 積分:3 註冊:2003-06-15 發送簡訊給我 |
謝謝你的建議, 我更改程式並秀出背景來了, 可是當我開子視窗時, 系統卻秀出Error Message 並進入 Debug mode. 是否可以請你幫我再看看哪裡出錯了,
謝謝. WNDPROC OldForm1WndProc;
LRESULT CALLBACK My_WndProc(HWND ,UINT ,WPARAM ,LPARAM );
//-------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TMainForm *MainForm;
//-------------------------------------------------------------------
__fastcall TMainForm::TMainForm(TComponent* Owner)
: TForm(Owner)
{
OldForm1WndProc=(WNDPROC)GetWindowLong(MainForm->Handle, GWL_WNDPROC);
SetWindowLong(ClientHandle, GWL_WNDPROC, (LONG)My_WndProc);
}
//-------------------------------------------------------------------
LRESULT CALLBACK My_WndProc(HWND hwnd, UINT Msg, WPARAM wParam, LPARAM lParam)
{
HDC MyDC; if(Msg == WM_ERASEBKGND) {
MyDC=(HDC)wParam;
SetStretchBltMode (MyDC,COLORONCOLOR);
StretchBlt(MyDC, 0, 0, MainForm->ClientWidth,MainForm->ClientHeight,
MainForm->MainImage->Picture->Bitmap->Canvas->Handle,
0, 0, MainForm->MainImage->Picture->Width, MainForm->MainImage->Picture->Height,
SRCCOPY);
return 1;
}
else
return CallWindowProc((FARPROC)OldForm1WndProc, hwnd, Msg, wParam, lParam);
} Error message: Project test.exe raised exception class EWin32Error witch message 'Win32 Error. Code:2,系統找不到指定的檔案'.process stopped. use Step or Run to continue.
|
Jeffrey_Chang
一般會員 發表:5 回覆:10 積分:3 註冊:2003-06-15 發送簡訊給我 |
|
Jeffrey_Chang
一般會員 發表:5 回覆:10 積分:3 註冊:2003-06-15 發送簡訊給我 |
雖然成功了, 可是檔案 Size 也加大了不少, 原因是使用了 BitMap 的圖檔所致, 所以經過改良使用 Jeg 圖檔就減少了許多, 畢竟有壓縮有差. 所以程式需加給行以將 Jeg 轉換成 Bmp. TJPEGImage *jmap = new TJPEGImage;
jmap->Assign(MainImage->Picture);
MainImage->Picture->Bitmap->Assign(jmap);
delete jmap; 不知其他高手有何另外的寫法, 謝謝.
|
RaynorPao
版主 發表:139 回覆:3622 積分:7025 註冊:2002-08-12 發送簡訊給我 |
引言: 雖然成功了, 可是檔案 Size 也加大了不少, 原因是使用了 BitMap 的圖檔所致, 所以經過改良使用 Jeg 圖檔就減少了許多, 畢竟有壓縮有差. 所以程式需加給行以將 Jeg 轉換成 Bmp. TJPEGImage *jmap = new TJPEGImage; jmap->Assign(MainImage->Picture); MainImage->Picture->Bitmap->Assign(jmap); delete jmap; 不知其他高手有何另外的寫法, 謝謝. Jeffrey_Chang 你好: (1)請問你說的 Size 是指 compile 之後的 EXE Size 嗎?? (2)請問你是不是在 design time 的時候就把你的圖檔載入到 TImage 裡面?? (3)試試看把你的圖檔使用 256 色 bitmap 或者是 jpeg,不要在 design time 的時候把圖檔案載入 TImage,而改成先把圖檔放在 *.res 或 *.rc 裡面, 在 runtime 的時候再動態載入圖檔-- Enjoy Researching & Developing --
------
-- 若您已經得到滿意的答覆,請適時結案!! -- -- 欲知前世因,今生受者是;欲知來世果,今生做者是 -- -- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 -- |
Jeffrey_Chang
一般會員 發表:5 回覆:10 積分:3 註冊:2003-06-15 發送簡訊給我 |
|
RaynorPao
版主 發表:139 回覆:3622 積分:7025 註冊:2002-08-12 發送簡訊給我 |
引言: 沒錯, 我是在 Design time 就放了圖檔至 TImage 了. 因為我只想要一個可執行檔就可以了. 你說將圖檔放置.res 或.rc 中, 可是這最後不是也被包在執行檔中嗎, 圖檔大, 執行檔也會跟著變大, 除非....放置.res 或.rc 中的檔案會被壓縮. 我沒試過, 我並不知道. Jeffrey_Chang 你好: (1)是的~~你說的應該沒錯,直接在 design time 把圖檔放入 TImage,會增加 link time 的時間;如果把圖檔放在 *.rc 裡面(*.res 我沒有試),則會增 加 compile time 的時間(比第一種 link time 的時間多很多),而且,對 於 size 應該是沒有什麼幫助 ( > > --
------
-- 若您已經得到滿意的答覆,請適時結案!! -- -- 欲知前世因,今生受者是;欲知來世果,今生做者是 -- -- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 -- |
Jeffrey_Chang
一般會員 發表:5 回覆:10 積分:3 註冊:2003-06-15 發送簡訊給我 |
|
bugmans
高階會員 發表:95 回覆:322 積分:188 註冊:2003-04-12 發送簡訊給我 |
|
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |