レイヤーのようなものを教えてください。

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


#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 2002/02/14(木) 17:54:46
コントロールの重ね合わせとかでない限り、前後関係は存在しないのではないでしょうか。
ひとつのウィンドウに文字と線が描かれていて、線は文字より手前。
ということはすなわち、「文字を書いてその上に線を上書きしている」ということになります。
やはり、文字を書いたらその上に線を再描画、という手段しかないのではないでしょうか。

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

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

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

kazuma 2002/02/15(金) 09:32:04
> 線を再描画する方法だと、文字が変わるたびに
> 線が一瞬消えて、ちらつくのが嫌なんです。

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

MAGURO ONLINE Yokohama (http://www2s.biglobe.ne.jp/~maekawa/index.html)
の
http://www2s.biglobe.ne.jp/~maekawa/dev/vc/redraw/
に解説とサンプルがあります。

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

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

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

API派 2002/02/15(金) 11:34:12
ありがとうございます。
線は水平線です。
スタティックコントロールを線に見立てるというのは
素敵なアイデアでした。
それをやって解決しました。

API派 2002/02/15(金) 11:34:15
[[解決]]
ありがとうございます。
線は水平線です。
スタティックコントロールを線に見立てるというのは
素敵なアイデアでした。
それをやって解決しました。

古いスレッドには追加発言できません。