レイヤーのようなものを教えてください。
同じ座標に、文字と線が重なっています。
文字は入れ替わります。
線は、常に文字より手前で、文字の入れ替わりによって
消えることがないようにしたいんです。
今のソースでは、文字が変わると線が消されてしまいます。
線が消えたら再描画すればいいというのではなく、
線の下のレイヤーの文字だけを書き替える方法を知りたいです。
線を再描画する方法だと、文字が変わるたびに
線が一瞬消えて、ちらつくのが嫌なんです。
#include <windows.h>
LRESULT CALLBACK WndProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam){
HDC hDC;
HPEN hPen;
switch (uMsg){
case WM_MOVE:
hDC = GetDC(hWnd);
hPen = CreatePen(PS_SOLID, 1, 200);
SelectObject(hDC, hPen);
MoveToEx(hDC, 10, 10, NULL);
LineTo(hDC, 50, 50);
DeleteObject(hPen);
ReleaseDC(hWnd, hDC);
break;
case WM_CHAR:
hDC = GetDC(hWnd);
TextOut(hDC, 30, 30, (char *)&wParam, 1);
ReleaseDC(hWnd,hDC);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, uMsg, wParam, lParam);
}
return 0;
}
コントロールの重ね合わせとかでない限り、前後関係は存在しないのではないでしょうか。
ひとつのウィンドウに文字と線が描かれていて、線は文字より手前。
ということはすなわち、「文字を書いてその上に線を上書きしている」ということになります。
やはり、文字を書いたらその上に線を再描画、という手段しかないのではないでしょうか。
> 線を再描画する方法だと、文字が変わるたびに
> 線が一瞬消えて、ちらつくのが嫌なんです。
>
再描画の方法によるのではないでしょうか。
掲載されているプログラムには、その辺りがない(省略されている?)ようですが。
ありがとうございます。
例えば、hWndにエディットボックスとLineTo()での
線が重なる部分があるように表示した場合、
エディットボックスは常に線の上にあって
線の色を激しく変更しても、エディットボックスは
全くちらつかなかったような記憶があるんです。
そんな、エディットボックスのような常にhWndの
最善面にあり、下の部分の描画によって消されない線を
描画したいと思って質問しました。
コントロールの重ね合わせというのをすれば
それができるんですか?
線を描画するウインドウを新しく作ってみたけど
線の下のhWndの領域に文字を書くと、線が消えてしまいました。
> 線を再描画する方法だと、文字が変わるたびに
> 線が一瞬消えて、ちらつくのが嫌なんです。
一旦メモリDCにすべてを描いてから、一気に画面に転送(BitBlt)するのが常套手段です。
MAGURO ONLINE Yokohama ( http://www2s.biglobe.ne.jp/~maekawa/index.html)
の
http://www2s.biglobe.ne.jp/~maekawa/dev/vc/redraw/
に解説とサンプルがあります。
> そんな、エディットボックスのような常にhWndの
> 最善面にあり、下の部分の描画によって消されない線を
> 描画したいと思って質問しました。
>
線が垂直線、あるいは水平線に限定されるなら、
細長いスタティックコントロールを線に見立てることができるでしょうが...
同一のウィンドウに対し、線はLineTo()で、文字はTextOut()で出力するなら、
最描画をいかに効率よく行うか、という問題は避けられないと思います。
#エディットボックスはあくまで例ですよね??
エディットボックスの上に線を引いて、線の下で入力したいということではないですよね?
ありがとうございます。
線は水平線です。
スタティックコントロールを線に見立てるというのは
素敵なアイデアでした。
それをやって解決しました。
ありがとうございます。
線は水平線です。
スタティックコントロールを線に見立てるというのは
素敵なアイデアでした。
それをやって解決しました。