Re: [問題] 用win32 api 寫類似小畫家的程式問題
※ 引述《greenlinux (GreenLinux)》之銘言:
: Visual C++ (Win32 api)
: 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...)
: Visual C++ (Win32 api)
: 問題(Question):
: 寫一個類似 小畫家的程式. 但我發現在畫線時,用 invalidate()重畫只會
: 畫出這次要畫的線段, 之前的線段會不見
: 例如: 若線段上有 (x0, y0)連到 (x1, y1) 再連到 (x2, y2) --> (x3, y3)
: 但每次只出現: (x0, y0) --> (x1, y1)
: 下一時間只出現:(x1, y1) --> (x2, y2);
: (x0, y0) --> (x1, y1)那段不見了..
: 我的code 大致上是:
: http://paste.plurk.com/show/2198891/
: 請各位協助.. 希望能連在一起,
: 難道真的要將所有的點都存起來, 然後每次重畫時都要
: 從 第0點畫到第N點,
: 下一刻就要從第0點畫到第N+1點???
: 謝謝...
我本來以為她是畫到暫存區然後再畫到顯示的hdc
後來仔細看根本錯了
ReleaseDC(hWnd, memDC);
BitBlt(hdc, 0,0, client.right, client.bottom, memDC, 0,0, SRCCOPY);
都releaseDC下面的程式怎麼可能有反應
MoveToEx(hdc, X, Y, NULL);
他的線都劃在顯示的hdc上這種是無法暫存的
這程式問題很大
正確寫法應該把
if (!memDC)
{
memDC = CreateCompatibleDC(hdc);
hMemBmp = CreateCompatibleBitmap(hdc, client.right, client.bottom);
hOldBmp = (HBITMAP)SelectObject(memDC, hMemBmp);
HBRUSH backgroundBrush = CreateSolidBrush(RGB(200,200,200));
FillRect(memDC, &client, backgroundBrush);//整片塗掉只能跑一次不然畫面就被蓋過
}
下面不能砍掉memDC
hMemBmp
在WM_DESTROY
在砍掉
然後所有畫到hdc都改畫到memDC
這樣就可達到效果了
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 60.251.70.82
※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1436261479.A.929.html
推
07/09 15:00, , 1F
07/09 15:00, 1F
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 3 之 3 篇):
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章