▼Windows Mobileプログラミングメモ▼
文字列の表示

文字列を表示するプログラムを作成する。



ダイアログの準備
  1. ソリューションエクスプローラのリソースファイルを右クリックし、ポップアップ「追加→リソース」を選択。
  2. Dialogをダブルクリックし、ダイアログ(IDD_DIALOG1)を生成。
  3. OKボタン(IDOK)とキャンセルボタン(IDCANCEL)を削除。
  4. ツールボックスの「Picture Control」をダイアログに配置。
  5. Picture ControlのIDを"IDC_STATIC1"に変更。


ソースコードの作成

  1. ソースコードを以下のように編集。
    main.cpp
    #include <windows.h>
    #include <windowsx.h>
    #include "resource.h"
    #include <aygshell.h> 
    #pragma comment(lib,"aygshell.lib")
    
    //システム関数の宣言
    BOOL DlgProc(HWND,UINT,WPARAM,LPARAM);
    BOOL GetWorkArea(int*,int*,int*,int*);
    void Create();
    void Paint();
    void Destroy();
    
    //描画関数の宣言
    HDC G_CreateDC();
    HBITMAP G_CreateBmp(HDC,int,int);
    HFONT G_CreateFont(LPTSTR,int,int);
    void G_SetColor(int,int,int);
    void G_DrawString(LPTSTR,int,int);
    void G_FillRect(int,int,int,int);
    
    //システム変数の宣言
    HWND hDlg  =NULL;
    int  screenW=0;
    int  screenH=0;
    
    //描画変数の宣言
    HDC     hdcOff=NULL;
    HBITMAP hOff  =NULL;
    HFONT   hFont =NULL;
    HGDIOBJ hPen  =NULL;
    HGDIOBJ hBrush=NULL;
    
    //メイン
    int WinMain(HINSTANCE hDlgance,HINSTANCE hPrevInstance,
        LPWSTR lpCmdLine,int nShowCmd) {
        //ダイアログの生成
        DialogBoxW(hDlgance,MAKEINTRESOURCE(IDD_DIALOG1),NULL,DlgProc);
        return 0;
    }
    
    //ダイアログのイベント処理
    BOOL DlgProc(HWND hDialog,UINT uMsg,WPARAM wp,LPARAM lp) {
        switch(uMsg) {
        //初期化
        case WM_INITDIALOG:{
            //ダイアログの設定
            SHINITDLGINFO sidi={
                SHIDIM_FLAGS,hDialog,
                SHIDIF_DONEBUTTON|SHIDIF_SIZEDLGFULLSCREEN|SHIDIF_EMPTYMENU};
            SHInitDialog(&sidi);
    
            //生成
            hDlg=hDialog;
            Create();
            
            //描画処理
            Paint();
            }
            break;
        //コマンド
        case WM_COMMAND:
            switch(LOWORD(wp)) {
            //OKボタン
            case IDOK:
                EndDialog(hDialog,LOWORD(wp));
                break;
            }
            break;
        //クローズ
        case WM_CLOSE:
            //解放
            Destroy();
            DestroyWindow(hDialog);
            break;
        }
        return FALSE;
    }
    
    //ワークエリアの計算
    BOOL GetWorkArea(int *x,int *y,int *w,int *h) {
        SIPINFO si={sizeof(SIPINFO)};
        if (!SipGetInfo(&si)) return FALSE;
        *x=si.rcVisibleDesktop.left;
        *y=si.rcVisibleDesktop.top;
        *w=si.rcVisibleDesktop.right-*x;
        if (si.fdwFlags&SIPF_ON) {
            *h=si.rcSipRect.top-*y;
        } else {
            *h=si.rcSipRect.bottom-*y;
        }
        return TRUE;
    }
    
    //生成
    void Create() {
        //ワークエリアの計算
        int x,y;
        GetWorkArea(&x,&y,&screenW,&screenH);
    
        //ピクチャの配置
        MoveWindow(GetDlgItem(hDlg,IDC_STATIC1),
            0,0,screenW,screenH,FALSE);
    
        //オフスクリーンの生成
        hdcOff=G_CreateDC();
        hOff=G_CreateBmp(hdcOff,screenW,screenH);
        hFont=G_CreateFont(_T("MS ゴシック"),0,24);
    }
    
    //描画
    void Paint() {
        //前処理
        HBITMAP hOffOld=(HBITMAP)SelectObject(hdcOff,hOff);
        HFONT hFontOld=(HFONT)SelectObject(hdcOff,hFont);
    
        //背景の描画
        G_SetColor(255,255,255);
        G_FillRect(0,0,screenW,screenH);
    
        //文字列の描画
        G_SetColor(255,0,0);
        G_DrawString(_T("高さ24の赤い文字列"),0,0);
    
        //後処理
        SelectObject(hdcOff,hOffOld);
        SelectObject(hdcOff,hFontOld);
    
        //ピクチャの画像更新
        SendMessage(GetDlgItem(hDlg,IDC_STATIC1),
            STM_SETIMAGE,IMAGE_BITMAP,(LPARAM)hOff);
    }
    
    //解放
    void Destroy() {
        DeleteDC(hdcOff);
        DeleteObject(hOff);
        DeleteObject(hFont);
        DeleteObject(hPen);
        DeleteObject(hBrush);
    }
    
    //デバイスコンテキストの生成
    HDC G_CreateDC() {
        return CreateCompatibleDC(NULL);
    }
    
    //フォントの生成
    HFONT G_CreateFont(LPTSTR name,int w,int h) {
        LOGFONT font;
        font.lfWidth         =w;
        font.lfHeight        =h;
        font.lfEscapement    =0;
        font.lfOrientation   =0;
        font.lfWeight        =0;
        font.lfItalic        =FALSE;
        font.lfUnderline     =FALSE;
        font.lfStrikeOut     =FALSE;
        font.lfCharSet       =SHIFTJIS_CHARSET;
        font.lfOutPrecision  =OUT_DEFAULT_PRECIS;
        font.lfClipPrecision =CLIP_DEFAULT_PRECIS;
        font.lfQuality       =ANTIALIASED_QUALITY;   
        font.lfPitchAndFamily=FIXED_PITCH|FF_MODERN;
        StringCchCopy(font.lfFaceName,32,name);
        return CreateFontIndirect(&font); 
    }
    
    //ビットマップの生成
    HBITMAP G_CreateBmp(HDC hdc,int w,int h) {
        BITMAPINFO bmi={0};
        void *pv;
        bmi.bmiHeader.biSize       =sizeof(BITMAPINFOHEADER);
        bmi.bmiHeader.biWidth      =w;
        bmi.bmiHeader.biHeight     =h;
        bmi.bmiHeader.biPlanes     =1;
        bmi.bmiHeader.biBitCount   =(SHORT)max(16,GetDeviceCaps(hdc,BITSPIXEL));
        bmi.bmiHeader.biCompression=BI_RGB;
        return CreateDIBSection(hdc,&bmi,DIB_RGB_COLORS,&pv,NULL,0);
    }
    
    //色の指定
    void G_SetColor(int r,int g,int b) {
        //テキスト色の指定
        SetBkMode(hdcOff,TRANSPARENT);
        SetTextColor(hdcOff,RGB(r,g,b));
    
        //ペン色とブラシ色の指定
        DeleteObject(hPen);
        DeleteObject(hBrush);
        hPen=CreatePen(PS_SOLID,1,RGB(r,g,b));
        SelectObject(hdcOff,hPen);
        hBrush=CreateSolidBrush(RGB(r,g,b));
        SelectObject(hdcOff,hBrush);
    }
    
    //文字列の描画
    void G_DrawString(TCHAR *str,int x,int y) {
        size_t size;
        StringCchLength(str,STRSAFE_MAX_CCH,&size); 
        ExtTextOut(hdcOff,x,y,NULL,NULL,str,size,NULL);
    }
    
    //矩形の塗り潰し
    void G_FillRect(int x,int y,int w,int h) {
        Rectangle(hdcOff,x,y,x+w,y+h);
    }



−戻る−