レイヤーのようなものを教えてください。 – プログラミング – Home

レイヤーのようなものを教えてください。
 
通知
すべてクリア

[解決済] レイヤーのようなものを教えてください。


API派
 API派
(@API派)
ゲスト
結合: 23年前
投稿: 6
Topic starter  

レイヤーのようなものを教えてください。
同じ座標に、文字と線が重なっています。
文字は入れ替わります。
線は、常に文字より手前で、文字の入れ替わりによって
消えることがないようにしたいんです。
今のソースでは、文字が変わると線が消されてしまいます。
線が消えたら再描画すればいいというのではなく、
線の下のレイヤーの文字だけを書き替える方法を知りたいです。
線を再描画する方法だと、文字が変わるたびに
線が一瞬消えて、ちらつくのが嫌なんです。

#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;
}


引用未解決
トピックタグ
sugar
 sugar
(@sugar)
ゲスト
結合: 23年前
投稿: 448
 

コントロールの重ね合わせとかでない限り、前後関係は存在しないのではないでしょうか。
ひとつのウィンドウに文字と線が描かれていて、線は文字より手前。
ということはすなわち、「文字を書いてその上に線を上書きしている」ということになります。
やはり、文字を書いたらその上に線を再描画、という手段しかないのではないでしょうか。

> 線を再描画する方法だと、文字が変わるたびに
> 線が一瞬消えて、ちらつくのが嫌なんです。
>
再描画の方法によるのではないでしょうか。
掲載されているプログラムには、その辺りがない(省略されている?)ようですが。


返信引用
API派
 API派
(@API派)
ゲスト
結合: 23年前
投稿: 6
Topic starter  

ありがとうございます。
例えば、hWndにエディットボックスとLineTo()での
線が重なる部分があるように表示した場合、
エディットボックスは常に線の上にあって
線の色を激しく変更しても、エディットボックスは
全くちらつかなかったような記憶があるんです。
そんな、エディットボックスのような常にhWndの
最善面にあり、下の部分の描画によって消されない線を
描画したいと思って質問しました。

コントロールの重ね合わせというのをすれば
それができるんですか?
線を描画するウインドウを新しく作ってみたけど
線の下のhWndの領域に文字を書くと、線が消えてしまいました。


返信引用
kazuma
 kazuma
(@kazuma)
ゲスト
結合: 23年前
投稿: 217
 

> 線を再描画する方法だと、文字が変わるたびに
> 線が一瞬消えて、ちらつくのが嫌なんです。

一旦メモリDCにすべてを描いてから、一気に画面に転送(BitBlt)するのが常套手段です。

MAGURO ONLINE Yokohama ( http://www2s.biglobe.ne.jp/~maekawa/index.html)

http://www2s.biglobe.ne.jp/~maekawa/dev/vc/redraw/
に解説とサンプルがあります。


返信引用
sugar
 sugar
(@sugar)
ゲスト
結合: 23年前
投稿: 448
 

> そんな、エディットボックスのような常にhWndの
> 最善面にあり、下の部分の描画によって消されない線を
> 描画したいと思って質問しました。
>
線が垂直線、あるいは水平線に限定されるなら、
細長いスタティックコントロールを線に見立てることができるでしょうが...

同一のウィンドウに対し、線はLineTo()で、文字はTextOut()で出力するなら、
最描画をいかに効率よく行うか、という問題は避けられないと思います。

#エディットボックスはあくまで例ですよね??
 エディットボックスの上に線を引いて、線の下で入力したいということではないですよね?


返信引用
API派
 API派
(@API派)
ゲスト
結合: 23年前
投稿: 6
Topic starter  

ありがとうございます。
線は水平線です。
スタティックコントロールを線に見立てるというのは
素敵なアイデアでした。
それをやって解決しました。


返信引用
API派
 API派
(@API派)
ゲスト
結合: 23年前
投稿: 6
Topic starter  

ありがとうございます。
線は水平線です。
スタティックコントロールを線に見立てるというのは
素敵なアイデアでした。
それをやって解決しました。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました