- ベストアンサー
WinAPIで文字の重ね書きはできるの?
//宣言部 HDC hD; PAINTSTRUCT ps; TEXTMETRIC tm; RECT rt; int i,j,k,l,m,n; string str; static int i_W,i_H,i_w,i_h; //処理部(ペイント部のみ) case WM_PAINT: hD=BeginPaint(hW,&ps); GetClientRect(hW,&rt); i_W=rt.right-rt.left; i_H=rt.bottom-rt.top; SelectObject(hD,GetStockObject(OEM_FIXED_FONT)); GetTextMetrics(hD,&tm); i_w=tm.tmAveCharWidth; i_h=i_H/24; SetROP2(hD,R2_NOTXORPEN);//これによる効果 SetTextAlign(hD,TA_LEFT|TA_TOP); ///////////////////////////////////////////////////////// Rectangle(hD,2*i_w,2*i_h,66*i_w,12*i_h);//ok Rectangle(hD,12*i_w,6*i_h,76*i_w,16*i_h);//ok str="||||||||||||||"; TextOut(hD,0,0,str.c_str(),str.size());//out str="--------------"; TextOut(hD,0,0,str.c_str(),str.size());//out ////////////////////////////////////////////////////////// EndPaint(hW,&ps); return 0; において"SetROP2(hD,R2_NOTXORPEN);"により長方形を被せずに書くことができます しかし文字は重ね書きできません 上の例では'+'を表示したいのに後で書いた'-'だけが表示されてしまいます 何か良い方法はないでしょうか?
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
SetBkMode(hD, TRANSPARENT); としておけばいいのではないでしょうか? # あと DC で NULL_BRUSH を選択しておけば、 # SetROP2(hD,R2_NOTXORPEN); # しなくても、長方形を塗りつぶさずに描けますよ。
その他の回答 (1)
- toysmith
- ベストアンサー率37% (570/1525)
|と-を別々のDCに書いてBitBltでOR演算する。 って言うのはダメですか?
お礼
すいません 回答の意味を取り違えていました できるかどうか確かめてみます
補足
素早い回答ありがとうございます 実は+を書くのが目的ではなく文字を重ねたものを書きたいのです Xと目を重ねて目を消したような文字です 他にもいろいろな組み合わせで重ねたいのです
お礼
ありがとうございました 下のようにすれば動きました そして質問はR2_MASKPENとすべきでしたね case WM_PAINT: hD=BeginPaint(hW,&ps); GetClientRect(hW,&rt); i_W=rt.right-rt.left; i_H=rt.bottom-rt.top; SelectObject(hD,GetStockObject(OEM_FIXED_FONT)); GetTextMetrics(hD,&tm); i_w=tm.tmAveCharWidth; i_h=i_H/24; i_ch=tm.tmHeight; SelectObject(hD,GetStockObject(NULL_BRUSH));//SetROP2(hD,R2_MASKPEN); SetTextAlign(hD,TA_LEFT|TA_TOP); SetBkMode(hD, TRANSPARENT); ////////////////////////////////////////////// Rectangle(hD,2*i_w,2*i_h,66*i_w,12*i_h); Rectangle(hD,12*i_w,6*i_h,76*i_w,16*i_h); str="||||||||||||||||||||||||||||||"; TextOut(hD,0,0,str.c_str(),str.size()); str="------------------------------"; TextOut(hD,0,0,str.c_str(),str.size()); ////////////////////////////////////////////// EndPaint(hW,&ps); return 0;