Google

東海大学理学部物理学科素粒子理論・安江研究室  

ホーム 最新情報 サイトマップ

描画・色

上へ ウィンドウズ カーソル メッセージの種類 描画・色 長方形領域 文字情報 時間 仮想キーコード

GetStockObject(INT fnobject)等で使います

GetStockObject(WHITE_BRUSH);

  • GRAY_BRUSH:Gray brush..

  • LTGRAY_BRUSH:Light gray brush.

  • HOLLOW_BRUSH:Hollow brush (equivalent to NULL_BRUSH)

  • NULL_BRUSH:Null brush (equivalent to HOLLOW_BRUSH)

  • DC_BRUSH:Windows 98, Windows NT 5.0 and later: Solid color brush. The default color is white. The color can be changed by using the SetDCBrushColor function. For more information, see the Remarks section. .

2節へ戻る

CreateSolidBrush(COLORREF rgbcolor)等で使います

COLORREF =DWORD(32ビット符号無し整数:負の数はありません)

CreateSolidBrush(rgbBLUE);

wndclass.hbrBackground = (HBRUSH)CreateSolidBrush(rgbBLUE)

で背景色を任意の色(この場合は)にできます

HDC

画面描画用のキャンパスを教えてくれます。これをデバイスコンテキスト(Device Context:DC)といいます。これ専用の型はHDCで指定されます。

WM_PAINT

画面を再表示する必要があるとき(隠れていたウィンドウズが前面に出てくるとき等)に来るので、自分で画面を再表示します。

  • wParam: 画面描画用のキャンパスを教えてくれます。HDCで指定されます。ゼロの場合は自前でウィンドウズのHDCを調べること。BiginPaint関数を使います。
    • HDC hdc = (HDC) wParam;
8節へ戻る

デバイスコンテキストを教えてくれる関数

  • 画面用(WM_PAINT内でのみ使用可能)HDC BeginPaint(HWND hWnd, LPPAINTSTRUCT lpps)
  • 画面用(WM_PAINT内で以外で使用可能)HDC GetDC(HWND hWnd)
    • 必ずReleaseDC関数でデバイスコンテキストを消去します。
  • プリンター用(WM_PAINT内で以外で使用可能)HDC CreateDC(LPCTSTR lpszDriver, LPCTSTR lpszPrinterName, LPCTSTR lpszPortName, CONST DEVMODE *lpInitData)
    • 必ずDeleteDC関数でデバイスコンテキストを消去します。
    • EnumPrinters(PRINTER_ENUM_FAVORITE | PRINTER_ENUM_LOCAL | PRINTER_ENUM_DEFAULT, NULL, 2,(LPBYTE) pPrinters, cbPrinters, &cbPrinters, &cReturned)
      cReturnedが正なら
      • pPrinters->pPrinterNameに通常使うプリンター名前
      • pPrinters->pDriverName通常使うプリンターのドライバー名
      • pPrinters ->pPortNamep通常使うプリンターのポート名
    • CreateDCドライバー名、プリンターの名前ポート名、NULL)

ドライバー名、プリンターの名前ポート名を取得するには

使用例

DWORD dwFlags = PRINTER_ENUM_FAVORITE | PRINTER_ENUM_LOCAL | PRINTER_ENUM_DEFAULT;
HGLOBAL hPrinters;
LPPRINTER_INFO_2 pPrinters;
DWORD cbPrinters, cReturned;
if(hPrinters = GlobalAlloc(LPTR, cbPrinters + 4)){
if(!(pPrinters = (LPPRINTER_INFO_2) GlobalLock(hPrinters))){
GlobalFree(hPrinters);
return -1;
}
}
else{
return -1;
}
EnumPrinters(dwFlags, NULL, 2, NULL, 0, &cbPrinters, &cReturned);
if(EnumPrinters(dwFlags, NULL, 2,(LPBYTE) pPrinters, cbPrinters, &cbPrinters, &cReturned)){
if(cReturned > 0){
INT i = 0; // i=0は通常使うプリンターを示します
strcpy(gszDeviceName,(pPrinters +i)->pPrinterName);
strcpy(gszPort,(pPrinters + i)->pPortName);
strcpy(gszDriverName,(pPrinters + i)->pDriverName);
}
else{
return 0;
}
}
GlobalUnlock(hPrinters);
GlobalFree(hPrinters);
return 1;

PAINTSTRUCT

画面描画用のキャンパスのデバイスコンテキストと描画方法の情報を持っています

  • LPPAINTSTRUCTPAINTSTRUCT FAR * (Win16);PAINTSTRUCT * (Win32)
  • PAINTSTRUCT ps; ⇒ LPPAINTSTRUCT lpps = &ps;
typedef struct tagPAINTSTRUCT {
HDC hdc;
BOOL fErase;
RECT rcPaint;
BOOL fRestore;
BOOL fIncUpdate;
BYTE rgbReserved[32];
} PAINTSTRUCT;
  • hdc:画面描画用のキャンパスのハンドル
  • fErase:背景を更新するか(fErase=FALSE)、更新せずに自前で更新するか(fErase=TRUE)
  • rcPaint:画面が書き換わる領域を指定
  • fRestoret:使いません
  • fIncUpdate:使いません
  • rgbReserved:使いません

HDC BeginPaint(HWND hWnd, LPPAINTSTRUCT lpPaint)

WM_PAINTメッセージを受け取ったときのみ実行できます。それ以外は、GetDC関数を使います。

最後にかならずEndPaint関数でデバイスコンテキストを消去します。

BOOL EndPaint(HDC hDC, PAINTSTRUCT Paint)

指定されたウィンドウの描画の終了を示します。この関数は、BeginPaint関数でペイント処理が完了した時点で必ず呼び出さなければなりません。

  • hDC:画面描画用のキャンパスのハンドル
  • Paint:BeginPaintで見つけたSTRUCT構造体用変数

使用例

PAINTSTRUCT ps;
HDC hDC;
hDC = BeginPaint(hWnd, &ps);
if(hDC){
ここで文字を書いたり絵を書いたりする
EndPaint(hDC, ps);
}

HDC GetDC(HWND hWnd)

指定されたウィンドウのクライアント領域に対するデバイスコンテキスト(画面やプリンタ)のハンドルを取得します。以後、このデバイスコンテキストを使って、クライアント領域内に描画ができます。この関数は、ウィンドウのクラスのスタイルに応じて、共通デバイスコンテキスト、またはクラスデバイスコンテキスト、またはプライベートデバイスコンテキストを取得します。共通デバイスコンテキストには、デフォルトの属性が割り当てられます。クラスコンテキストおよびプライベートコンテキストには、以前の属性がそのまま割り当てられます。

  • hWnd:描画したいウィンドウズの名札

HDC ReleaseDC(HWND hWnd,HDC hDC)

GetDC関数で見つけたデバイスコンテキストを解放します。

  • hWnd:描画したいウィンドウズの名札
  • hDC:画面描画用のキャンパスのハンドル

使用例

HDC hDC;
hDC=GetDC(hWnd);
if(hDC){
ここで文字を書いたり絵を書いたりする
ReleaseDC(hWnd, hDC);
}

HDC CreateDC(LPCTSTR lpszDriver, LPCTSTR lpszDevice, LPCTSTR lpszOutput, CONST DEVMODE *lpInitData)

指定されたデバイスのデバイスコンテキストを、指定の名前で作成します。

  • lpszDriver:
    • Windows 95 以降: Win32 ベースのアプリケーションでは、このパラメータは無視されます。NULL を指定してください。ただし、NULL で終わる文字列 "DISPLAY" へのポインタを指定すると、ディスプレイのデバイスコンテキストのハンドルが取得できます。このパラメータで "DISPLAY" へのポインタを指定したときは、ほかのパラメータをすべて NULL にしなければなりません。
    • Windows NT: ディスプレイのデバイスコンテキストのハンドルを取得するときは、NULL で終わる文字列 "DISPLAY" へのポインタを指定します。プリンタのデバイスコンテキストのハンドルを取得するときは、NULL で終わるプリンタドライバの名前 (通常は "WINSPOOL") へのポインタを指定します。
  • lpszDevice:出力デバイスの名前が入った NULL で終わる文字列へのポインタを指定します (たとえば、"Epson FX-80") 。プリンタモデルの名前ではありません。このパラメータは必須です。
  • lpszOutput:指定されたデバイスのデバイスコンテキストを、指定の名前で作成します。Win32 アプリケーションでは、このパラメータは無視されます。NULL を指定してください。
  • lpInitData:デバイスドライバに対するデバイス固有の初期化データが入ったDEVMODE 構造体へのポインタを指定します。DocumentProperties 関数を使うと、指定したデバイスの情報を MSG 構造体の形で取得できます。デフォルトの初期化を使用する場合は、NULL を指定します。

BOOL DeleteDC(HDC hdc)

CreateDC関数で見つけたデバイスコンテキストを削除します。

  • hDC:画面描画用のキャンパスのハンドル

COLORREF

3原色(Red、Green、Blue)を示す色を指定します。

  • LPCOLORREFCOLORREF FAR * (Win16);COLORREF * (Win32)
  • COLORREF cr; ⇒ LPCOLORREF lprc = &lpcr;

それぞれの色は256種類取れます。

  • R: 0〜0xFF(=256)の256色
  • G: 0〜0xFF(=256)の256色
  • B: 0〜0xFF(=256)の256色

COLORREFで

  • 赤は0xFF0000
  • 緑は0x00FF00
  • 青は0x0000FF

となります。簡単には、RGBで指定します。

  • 赤=RGB(0xFF, 0x00, 0x00)
  • 緑=RGB(0x00, 0xFF, 0x00)
  • 青=RGB(0x00, 0x00, 0xFF)

同様に任意の色が作れます。

  • rgbWHITE:#define rgbWHITE RGB(0xff, 0xff, 0xff)

  • rgbDARKWHITE:#define rgbDARKWHITE RGB(0xe0, 0xe0, 0xe0)

  • rgbBLACK:#define rgbBLACK RGB(0, 0, 0)

  • rgbDARKBLACK:#define rgbDARKBLACK RGB(0x10, 0x10, 0x10)

  • rgbLIGHTBLACK:#define rgbLIGHTBLACK RGB(0x20, 0x20, 0x20)

  • rgbGRAY:#define rgbGRAY RGB(0x80, 0x80, 0x80)

  • rgbBKGRAY:#define rgbBKGRAY RGB(0x30, 0x30, 0x30)

  • rgbDARKGRAY:#define rgbDARKGRAY RGB(0x40, 0x40, 0x40)

  • rgbLIGHTGRAY:#define rgbLIGHTGRAY RGB(0xc0, 0xc0, 0xc0)

  • rgbBRIGHTGRAY:#define rgbBRIGHTGRAY RGB(0xd0, 0xd0, 0xd0)

  • rgbRED:#define rgbRED RGB(0xff, 0, 0)

  • rgbDARKRED:#define rgbDARKRED RGB(0x80, 0, 0)

  • rgbLIGHTRED:#define rgbLIGHTRED RGB(0xff, 0x80, 0x80)

  • rgbGREEN:#define rgbGREEN RGB(0, 0xff, 0)

  • rgbDARKGREEN:#define rgbDARKGREEN RGB(0, 0x80, 0)

  • rgbLIGHTGREEN:#define rgbLIGHTGREEN RGB(0x80, 0xff, 0x80)

  • rgbBLUE:#define rgbBLUE RGB(0, 0, 0xff)

  • rgbDARKBLUE:#define rgbDARKBLUE RGB(0, 0, 0x80)

  • rgbLIGHTBLUE:#define rgbLIGHTBLUE RGB(0x80, 0x80, 0xff)

  • rgbCYAN:#define rgbCYAN RGB(0, 0xff, 0xff)

  • rgbDARKCYAN:#define rgbDARKCYAN RGB(0, 0x80, 0x80)

  • rgbLIGHTCYAN:#define rgbLIGHTCYAN RGB(0x80, 0xff, 0xff)

  • rgbMAGENTA:#define rgbMAGENTA RGB(0xff, 0, 0xff)

  • rgbDARKMAGENTA:#define rgbDARKMAGENTA RGB(0x80, 0, 0x80)

  • rgbLIGHTMAGENTA:#define rgbLIGHTMAGENTA RGB(0xff, 0x80, 0xff)

  • rgbYELLOW:#define rgbYELLOW RGB(0xff, 0xff, 0)

  • rgbDARKYELLOW:#define rgbDARKYELLOW RGB(0x80, 0x80, 0)

  • rgbLIGHTYELLOW:#define rgbLIGHTYELLOW RGB(0xff, 0xff, 0x80)

  • rgbCREAMYELLOW:#define rgbCREAMYELLOW RGB(0xff, 0xff, 0xe0)

2節へ戻る

COLORREF SetTextColor(HDC hDC, COLORREF crColor)

文字の色を指定します。

そして文字を書くにはDrawText関数をつかってみます。

INT DrawText(HDC hDC, LPCTSTR lpMessage, INT nSize, LPRECT lpRect, UINT uFotmat)

  • hDC:画面やプリンターへのキャンバスハンドル.
  • lpMessage:表示するメッセージ
  • nSize:表示する文字列の長さ:stelen(lpMessage) sizeof(lpMessage)但し、配列に限る
  • lpRect:テキストを表示する長方形領域:このなかでuFormatに従って整形されます
  • uFormat:整形方法を指定します
    • DT_BOTTOM 一行表示(DT_SINGLELINE)のときに下線にそろえる。
    • DT_CALCRECT 一行表示のとき、文字が少なく右一杯にならないときに長方形を調節して接するようにします。複数行表示のときは高さを調節して全体が収まるようにします。で、テキストの高さを返します。計算のみ実行し文字は表示しません。
    • DT_CENTER 左右中央に書きます。
    • DT_EDITCONTROL 複数行表示のエディトボックスをシミュレートします。
    • DT_END_ELLIPSIS or DT_PATH_ELLIPSIS 指定の長方形内に収まるように文字列の省略をします。但し、 DT_MODIFYSTRINGを指定する必要があります。文字列の最後尾を省略する場合にDT_END_ELLIPSISを指定します。中間で省略するにはDT_PATH_ELLIPSISを指定します。また、フォルダ文字列のように¥記号を含んでいるときは¥記号以降の文字列が損なわれないようにします。
    • DT_EXPANDTABS たぶを8個分の空白で展開します。DT_WORD_ELLIPSIS, DT_PATH_ELLIPSIS, DT_END_ELLIPSISと一緒に使えません。
    • DT_EXTERNALLEADING 文字の高さに余分な空白を含める。
    • DT_HIDEPREFIX Windows NT 2000以降: 下線付文字を出す&命令(&プレフィックス文字)のみを無視する。他の命令文字はそのまま。
      • input string: "A&bc&&d"
        • ⇒normal: "Abc&d"(bに下線がつく)
        • ⇒HIDEPREFIX: "Abc&d"
      • DT_NOPREFIX と DT_PREFIXONLY少々違います
    • DT_INTERNAL 文字の大きさなどを計算するのにシステムフォントを使用します
    • DT_LEFT 左揃え
    • DT_MODIFYSTRING 長方形に合うように文字列を修正します。DT_END_ELLIPSISとDT_PATH_ELLIPSISを一緒に指定してください。.
    • DT_NOCLIP 長方形からはみ出した部分もそのまま表示します。通常は、表示しません。.
    • DT_NOFULLWIDTHCHARBREAK Windows NT 2000以降とWindows 98: 日本語などの2バイト文字の場合に真中(一バイト目)で改行しないようにします。 DT_WORDBREAKも一緒に指定します。
    • DT_NOPREFIX すべてのプレフィックス文字による効果を無視します。DT_HIDEPREFIXとDT_PREFIXONLYの違いにも注意。.
    • DT_PREFIXONLY Windows NT 2000以降: 下線部のみ表示します。DT_NOPREFIXとDT_HIDEPREFIXも参照。.
    • DT_RIGHT 右揃え
    • DT_RTLREADING ヘブライ文字やアラビック文字のように右から左に表示します。
    • DT_SINGLELINE 一行に表示します。行替え命令は無視されます。
    • DT_TABSTOP タブストップの展開文字数を指定します。 上位バイトがその文字数になります。DT_CALCRECT, DT_EXTERNALLEADING, DT_INTERNAL, DT_NOCLIP及びDT_NOPREFIXは一緒に使えません。
    • DT_TOP 一行表示の時に上端をそろえます。
    • DT_VCENTER 上下中央に書きます。
    • DT_WORDBREAK 長方形の右端から単語がはみ出るときには、その単語を次の行に表示します。. 日本語のような2バイト文字の場合はDT_NOFULLWIDTHCHARBREAKも一緒につかうといいでしょう。
    • DT_WORD_ELLIPSIS 長方形内に収まらないときには省略して省略記号を表示します。

使用例

COLORREF oldcolor;
RECT rc;
CHAR sz_message[] = "Hellow!!!";
SetRect(&rc, 100, 100, 200, 120);
oldcolor = SetTextColor(hDC, RGB(0xff, 0x00, 0x00));
DrawText(hDC, sz_message, strlen(sz_message), &rc, DT_CENTER | DT_VCENTER);
if(old_color != CLR_INVALID){
SetTextColor(hDC, oldcolor);
}
   

前へ ホーム 上へ 次へ

このWeb サイトではインターネットエクスプローラVer.3.0あるいはそれ以上が推奨です Internet Explorer
この Web サイト(since 1997年12月1日)に関する質問やコメントについては、Mail.gif (4196 バイト)安江 まで電子メールをお送りください。
Copyright © 1997-2022/10 東海大学理学部物理学科安江研究室 All rights reserved
最終更新日: 2022年10月14日
マイクロソフト Front Page98