• ベストアンサー

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);"により長方形を被せずに書くことができます しかし文字は重ね書きできません 上の例では'+'を表示したいのに後で書いた'-'だけが表示されてしまいます 何か良い方法はないでしょうか?

  • nubou
  • お礼率62% (293/470)

質問者が選んだベストアンサー

  • ベストアンサー
noname#5537
noname#5537
回答No.2

SetBkMode(hD, TRANSPARENT); としておけばいいのではないでしょうか? # あと DC で NULL_BRUSH を選択しておけば、 # SetROP2(hD,R2_NOTXORPEN); # しなくても、長方形を塗りつぶさずに描けますよ。

nubou
質問者

お礼

ありがとうございました 下のようにすれば動きました そして質問は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;

その他の回答 (1)

  • toysmith
  • ベストアンサー率37% (570/1525)
回答No.1

|と-を別々のDCに書いてBitBltでOR演算する。 って言うのはダメですか?

nubou
質問者

お礼

すいません 回答の意味を取り違えていました できるかどうか確かめてみます

nubou
質問者

補足

素早い回答ありがとうございます 実は+を書くのが目的ではなく文字を重ねたものを書きたいのです Xと目を重ねて目を消したような文字です 他にもいろいろな組み合わせで重ねたいのです

関連するQ&A

  • 5^3をAPIで表示するために

    HDC hD; PAINTSTRUCT ps; TEXTMETRIC tm; HDROP hDrop; HFONT hPF,hF; string str; int i_w,i_h; ................................................................ case WM_PAINT: hD=BeginPaint(hW,&ps); SelectObject(hD,GetStockObject(OEM_FIXED_FONT)); GetTextMetrics(hD,&tm); i_w=tm.tmAveCharWidth; i_h=tm.tmHeight; SetTextAlign(hD,TA_LEFT|TA_TOP); ///////////////////////////////////////////////// str="5"; TextOut(hD,0,0,str.c_str(),str.size()); ///////////////////////////////////////////////// hF=CreateFont (i_h/2,i_w/2,0,0,FW_NORMAL,FALSE,FALSE,FALSE,SHIFTJIS_CHARSET,OUT_DEFAULT_PRECIS ,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,FIXED_PITCH|FF_MODERN,"System"); hPF=(HFONT)SelectObject(hD,hF); ///////////////////////////////////////////////// str="3"; TextOut(hD,i_w,0,str.c_str(),str.size()); ///////////////////////////////////////////////// SelectObject(hD,hPF); DeleteObject(hF); EndPaint(hW,&ps); return 0; とすればできますがCreateFontによる文字サイズは思うようなサイズにならないことが多くてやってみないとサイズが半分になっているかどうかわかりません 酷い場合には半分のサイズを指定しても全くサイズが変わらない場合もあります 上の例では i_h=18でありi_w=8でありCreateFont後 キャラクタの高さはi_h/2=9となりキャラクタの幅はi_w/2=4になってくれました しかしこの場合はたまたまうまくいったので通常はこうはなりません 確実にもとのサイズの半分(面積比1/4)のキャラクタサイズにする方法を教えてください

  • 最初ボタンが見えない

    ボタンを大きく中央に表示するプログラムを作りました。 しかし中央をクリックするまでボタンが現れません。 どうしたら最初からボタンが現れるのでしょうか? またフォントをクリエイトし続けてリソースは尽きないのでしょうか? #include <windows.h> #include <stdio.h> HWND hB; LONG WINAPI WinProcedure(HWND hW,UINT wM,UINT wP,LONG lP) { RECT rt; char s[99]; int W,H; static HFONT hF; switch(wM) { case WM_PAINT: GetClientRect(hW,&rt); W=rt.right-rt.left;H=rt.bottom-rt.top; DeleteObject(hF); hF=CreateFont(H/4,W/4,0,0,FW_NORMAL,FALSE,FALSE,FALSE,SHIFTJIS_CHARSET,OUT_TT_ONLY_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,FIXED_PITCH|FF_MODERN,"MS Pゴシック"); SendMessage(hB,WM_SETFONT,(WPARAM)hF,1); MoveWindow(hB,W/4,H/4,W/2,H/2,1); sprintf(s,"幅=%d,高さ=%d",H,W);SetWindowText(hW,s); return 0; case WM_DESTROY: PostQuitMessage(0); return 0; default: return(DefWindowProc(hW,wM,wP,lP)); } } WINAPI WinMain(HINSTANCE hI,HINSTANCE,LPSTR,int) { WNDCLASS wc; --略--(ここにウィンドウクラスwcをクラス名"I"で登録) RegisterClass(&wc); hW=CreateWindow("I","ボタンの親",WS_OVERLAPPEDWINDOW,0,0,0,0,0,0,hI,0); hB=CreateWindow("BUTTON","子",WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON,0,0,0,0,hW,0,hI,0); ShowWindow(hW,SW_SHOWMAXIMIZED); UpdateWindow(hW); while(GetMessage(&ms,0,0,0)) { TranslateMessage(&ms); DispatchMessage(&ms); } return (ms.wParam); }

  • Windowをドラッグ移動したい

    ために以下のようなコードを打ちましたが 素早く動かすとマウスがクライアント領域からはずれ タイトルバーをドラッグ移動したときのようになりません なにか方法はないでしょうか? case WM_MOUSEMOVE:  if(wP==MK_LBUTTON)  {   if(0<=i_x && 0<=i_y)   {    GetWindowRect(hW,&rt);    MoveWindow (hW, rt.left+LOWORD(lP)-i_x, rt.top+HIWORD(lP)-i_y, rt.right-rt.left,rt.bottom-rt.top,1);   }  }  else i_x=i_y=-1;  return 0; case WM_LBUTTONUP:  if(egg)i_x=i_y=-1;  return 0; case WM_LBUTTONDOWN:  i_x=LOWORD(lP);i_y=HIWORD(lP);  return 0;

  • WM_QUERYENDSESSIONを使って次文で

    #include <windows.h> LRESULT CALLBACK WndProc(HWND hW,UINT ms,WPARAM wp,LPARAM lp) { HDC hD; PAINTSTRUCT ps; static int width=0,height=0; static TCHAR strSize[128]; static boolean b_logoff; int i; switch(ms) { case WM_QUERYENDSESSION: b_logoff=true; i=MessageBox(hW,"end?","?",MB_YESNO|MB_TOPMOST); if(i==IDNO)b_logoff=false; case WM_CLOSE: case WM_DESTROY: PostQuitMessage(0); return b_logoff; case WM_SIZE: width=LOWORD(lp); height=HIWORD(lp); return b_logoff; case WM_PAINT: hD=BeginPaint(hW,&ps); wsprintf(strSize,"width = %d : height= %d",width,height); TextOut(hD,10,10,strSize,lstrlen(strSize)); EndPaint(hW,&ps); return b_logoff; } return DefWindowProc(hW,ms,wp,lp); } ユーザがWindowsを終了させようとしたときに ウォーンング用の警告ボックスを表示したのですが Noボタンを押してもWindowsが終了してしまいます 何が悪いのでしょうか?

  • イラストレーターでドキュメント上に配置している図形の座標を取得するja

    イラストレーターでドキュメント上に配置している図形の座標を取得するjavascriptを探していたところ、以下のプログラムを見つけたのですが、うまく動きません(ファイルが作成されません)。プログラムのどこが原因で動かないのかが分かる方いましたら教えていただけないでしょうか。 var outputFile = new File("Centroid_of_Selection.txt"); outputFile.open("write"); var sel= activeDocument.selection; var str=""; for(var i=0; i<sel.length; i++){ var str_name=sel[i].name; var top_left=sel[i].position; var w=sel[i].width; var h=sel[i].height; var centroid_x=top_left[0]+(w/2); var centroid_y=top_left[1]-(h/2); str=str_name+"\t"+centroid_x+"\t"+centroid_y; outputFile.writeln(str); } outputFile.close(); <動作> デスクトップにテキストファイルとして書き出される。 単位はポイント。 図形の名前、X座標、Y座標 の順番でタブ区切りになる。

  • OpenGLでウィンドウハンドルの取得

    コンソールアプリで作ることが前提です。 glut関数で作成したウィンドウのハンドルを取得し、その画面上に文字を表示しようとTextOutやDrawTextやらを使ってみたんですが、背景色しか表示されません。DrawTextの戻り値が18だったので成功していると思うのですが。どこがおかしいのかご指摘をお願いします。 #include<stdio.h> #include<windows.h> #include<GL/glut.h> HWND hwnd; void display(){ glClearColor(0.5,0.5,0.5,1); glClear(GL_COLOR_BUFFER_BIT); hwnd=GetActiveWindow(); PAINTSTRUCT ps; HDC hdc; RECT rect; LPCSTR str = TEXT("あああ"); GetClientRect(hwnd, &rect); hdc = BeginPaint(hwnd, &ps); SetRect( &rect, 10, 10, 100, 100); TextOut(hdc, 10, 10, str, lstrlen(str));    DrawText(hdc, TEXT("あああ"), -1, &rect,DT_CENTER); EndPaint(hwnd, &ps); glFlush(); } int main(int argc,char **argv){ glutInit(&argc,argv); glutInitWindowSize(640,480); glutCreateWindow("aaa"); glutDisplayFunc(display); glutMainLoop(); return(0); }

  • ユーザー定義オブジェクト

    現在、ユーザー定義オブジェクトについて勉強しています。 以下は本からの抜粋です。 //コンストラクタを定義する。 //thisで参照するオブジェクトの初期化法に注目   function Rectangle(w,h) { this.width=w; this.height=h; } //コンストラクタを呼び出して2つの長方形オブジェクトを生成する。 //widthとheightをコンストラクタに渡して、それぞれの新しい //オブジェクトを適切な形で初期化するやり方に注目 var rect1=new Rectangle(2,4); var rect2=new Rectangle(8.5,11); ★質問★ this.width=w; this.height=h; var rect1=new Rectangle(2,4); var rect2=new Rectangle(8.5,11); この2箇所で行っている「初期化」という作業の意味がよく分かりません。 また、ユーザー定義オブジェクトの概念についていまいちイメージ がつかめていません(特にthisとnewを使用している意図など) ご教授いただきたく、よろしくお願いします。

  • ファイルに文字列を書く

    ファイルを2つ読み込んでファイルを書き直そうとしたのですが 2度目に書き込もうとしたときに改行の書き込みがおかしくなってしまいます してほしいところで改行を一回だけしてほしいと思っているのですが 実際には多数改行されます どうしたら改行が一回だけになりますか? ---ソース--- #include <stdio.h> void main(void){ FILE *fp; char *tm[1000]; char buf[400]; int i=1,sei; fp= fopen("now.txt","w+"); fprintf(fp,"もも"); fclose(fp); //何で最初に書き込んでるんだ? //という突っ込みがあるでしょうが本当に作りたいプログラムは最初にファイルに書き込まないといけないためです。 fp= fopen("now.txt","r"); while( fgets( buf, 400, fp ) != NULL ){ tm[0]=(char*)malloc(strlen(buf)+1); strcpy(tm[0], buf); } fclose(fp); fp =fopen("moto.txt","r"); while( fgets( buf, 400, fp ) != NULL ){ if(i<999){ tm[i] = (char*)malloc(strlen(buf+1)); strcpy(tm[i], buf); i++; } else{ tm[999] = (char*)malloc(strlen(buf+1)); strcpy(tm[999], buf); } } fclose(fp); if(i<1000){ sei=i; } else{ sei=1000; } fp =fopen("chat_deta.txt","w+"); for(i=0;i<sei;i++){ fprintf(fp,"%s\n",tm[i]); } if(i!=(sei-1)){ fprintf(fp,"\n"); } for(i=0;i<sei;i++){ free(tm[i]); } fclose(fp); } } ---now.txt--- もも ---moto.txt--- オレンジ みかん

  • javaの課題が難しくて解けません。力を貸してください

    本日、プログラムの授業で課題が出されました。 解ける方がいましたら、回答を教えてください。 課題:これまでの演習で作成した Rectangle, Triangle, Circle, Trapezoidクラスを利用するクラス (メインクラス)を修正して, コマンドライン引数から図形の種類、入力値を指定できるようにしてみよ。 ※4つのクラスをpackageで1つにまとめる必要があるようです。 お手数かけますが、宜しくお願いします。 下記が演習で作成した4つのクラスになります。参考にしてください。 (Rectangleクラス) import java.io.*; class Rectangle { private int width; private int height; public Rectangle(int w, int h) { width = w; height = h; } public void setWidth(int w) { width = w; } public void setHeight(int h) { height = h; } public int getWidth() { return width; } public int getHeight() { return height; } public double calcArea() { return width * height; } public void show() { System.out.println("width=" + getWidth() + ", height= " + getHeight()); } } public class kadai1 { public static void main(String args[]) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); System.out.print("width= "); String str1 = br.readLine(); System.out.print("height= "); String str2 = br.readLine(); Rectangle r = new Rectangle(Integer.parseInt(atr1),Integer.parseInt(str2)); r.show(); System.out.println("面積 = " + r.calcArea()); } } (Triangleクラス) public double calcArea() { return width * height / 2.0; } (Circleクラス) public double calcArea() { return Math.PI * radius * radius; } public void show() { System.out.println("radius= " + getRadius()); } (Trapezoidクラス) public double calcArea() { return (upper + lower) * height / 2.0; } public void show() { System.out.println("upper= " + getUpper() + ", lower= " + getLower() + ", height= " + getHeight()); }

  • HWエンコーダ  

    i7-2600K / H67 Express /インテル HD 3000 Graphics (SandyBridge Quick Sync Video) (内蔵GPUをプライマリ) i7-2600K / H67 Express /Radeon HD 5770 (外付けGPUをプライマリ) HWエンコーダ する場合上記のどちらが速いですか?

専門家に質問してみよう