<?xml version="1.0" encoding="Shift_JIS"?>
<?xml-stylesheet type="text/xsl" href="tips.xsl"?>
<root>
  <tips>
    <date>2003/06/23</date>
    <title><linkURL url="#0001">データからトークンを抽出分割</linkURL></title>
    <target>Visual C++</target>
    <text>
bool CDATA::ReadNamefile()
{
    char s[100];
    char seps[] = ",\n";

    FILE *fp;

    if((fp = fopen("\\My Documents\\namefile.csv", "r")) == NULL){
        return FALSE;
    }
    else{
        for(int i = 0; i &lt; NUM; i++){
            fscanf(fp, "%s", s);
            setup_data[i].setup_terminal_id = strtok(s, seps);                // 端末ID
            fscanf(fp, "%s", s);
            setup_data[i].setup_kanji1 = strtok(s, seps);            // 漢字１
            setup_data[i].setup_kana1 = strtok(NULL, seps);            // 漢字１
            fscanf(fp, "%s", s);
            setup_data[i].setup_kanji2 = strtok(s, seps);            // 漢字２
            setup_data[i].setup_kana2 = strtok(NULL, seps);            // 漢字２
            fscanf(fp, "%s", s);
            setup_data[i].setup_kanji3 = strtok(s, seps);            // 漢字３
            setup_data[i].setup_kana3 = strtok(NULL, seps);            // 漢字３
            fscanf(fp, "%s", s);
            setup_data[i].setup_kanji4 = strtok(s, seps);            // 漢字４
            setup_data[i].setup_kana4 = strtok(NULL, seps);            // 漢字４
        }
        fclose(fp);
        return TRUE;
    }
}

    </text>
  </tips>

  <tips>
    <date>2003/06/23</date>
    <title><linkURL url="#0002">カレントパスの取得</linkURL></title>
    <target>eMbedded Visual C++</target>
    <text>
カレントパスの取得

    TCHAR FPath[_MAX_PATH];
    ::GetModuleFileName(NULL,FPath,sizeof FPath);
    
    int pindex;
    CString Pathbuf;
    //Pathbuf.Format(_T("%s"),FPath);
    Pathbuf = FPath;
    pindex = Pathbuf.ReverseFind('\\');
    Path = Pathbuf.Left(pindex);
    Path += "\\";
    </text>
  </tips>

  <tips>
    <date>2003/06/23</date>
    <title><linkURL url="#0003">メニューバーの設定</linkURL></title>
    <target>eMbedded Visual C++ PocketPC2002</target>
    <text>
リソースエディタでメニューを作成し、この例では
メニューIDをIDR_MENUBARとし、左端のメニューIDをIDM_CONFとする。

ヘッダー内の記述
    HMENU hEditMenu;


OninitDialog内の記述
    SHMENUBARINFO mbi;
    memset(&amp;mbi, 0, sizeof(SHMENUBARINFO));
    mbi.cbSize = sizeof(SHMENUBARINFO);
    mbi.hwndParent = this->m_hWnd;
    mbi.nToolBarId = IDR_MENUBAR;
    mbi.hInstRes = ::AfxGetInstanceHandle() ;
    mbi.nBmpId = 0;
    mbi.cBmpImages = 0;
    SHCreateMenuBar(&amp;mbi);
    hEditMenu = (HMENU)::SendMessage(mbi.hwndMB,SHCMBM_GETSUBMENU,0,IDM_CONF);
    </text>
  </tips>

  <tips>
    <date>2003/06/23</date>
    <title><linkURL url="#0004">ハードウェアボタンを使う</linkURL></title>
    <target>eMbedded Visual C++ PocketPC2002</target>
    <text>
Oninit内に以下の記述を行う。
    // ハードウェアボタンの設定
    HWND hWnd;
    hWnd = ::GetForegroundWindow();
    RegisterHotKey(hWnd, 1, MOD_WIN, 0xC1);
    RegisterHotKey(hWnd, 2, MOD_WIN, 0xC2);
    RegisterHotKey(hWnd, 3, MOD_WIN, 0xC3);
    RegisterHotKey(hWnd, 4, MOD_WIN, 0xC4);


WindowProcを作成し以下の記述を行う。
LRESULT CSTART01Dlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) 
{
    // TODO: この位置に固有の処理を追加するか、または基本クラスを呼び出してください
    // ハードウェアボタンを押したときの、動作の割り当て
    switch(message){
    case WM_HOTKEY:
        switch(wParam){
        case 1:
            OnBtnUp1();
            break;
        case 2:
            OnBtnUp2();
            break;
        case 3:
            OnBtnUp3();
            break;
        case 4:
            OnBtnUp4();
            break;
        }
    }
    return CDialog::WindowProc(message, wParam, lParam);
}    </text>
  </tips>

  <tips>
    <date>2003/06/23</date>
    <title><linkURL url="#0005">コントロールのフォント設定</linkURL></title>
    <target>Visual C++</target>
    <text>
CFont型のfBoldの場合の設定例：
OnInitDilalog内の記述
    fBold.CreateFont
        (14,0,0,0,FW_BOLD,0,0,0,DEFAULT_CHARSET,
        OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,
        DEFAULT_QUALITY,DEFAULT_PITCH,_T("ＭＳ ゴシック"));
    GetDlgItem(IDC_DISPLAY1)-&gt;SetFont(&amp;fBold);
    </text>
  </tips>

  <tips>
    <date>2003/06/23</date>
    <title><linkURL url="#0014">タブコントロールの使用</linkURL></title>
    <target>Visual C++</target>
    <text>
ヘッダー
    CTabCtrl    m_tab;

OnInitDialog内
    // ここはタブの追加と名称の設定
    m_tab.InsertItem(0,_T("1"));
    m_tab.InsertItem(1,_T("2"));
    m_tab.InsertItem(2,_T("3"));
    m_tab.InsertItem(3,_T("4"));
    m_tab.InsertItem(4,_T("5"));
    m_tab.InsertItem(5,_T("6"));
    m_tab.InsertItem(6,_T("7"));
    m_tab.InsertItem(7,_T("8"));
    m_tab.InsertItem(8,_T("9"));

    //対象になるダイアログIDの設定
    dlg1.Create(IDD_COURSE,&amp;m_tab);
    dlg2.Create(IDD_OPCHK,&amp;m_tab);
    dlg3.Create(IDD_OPCHK,&amp;m_tab);
    dlg4.Create(IDD_ANALOG,&amp;m_tab);
    dlg5.Create(IDD_ANALOG,&amp;m_tab);
    dlg6.Create(IDD_ANALOG,&amp;m_tab);
    dlg7.Create(IDD_OUTCHK,&amp;m_tab);
    dlg8.Create(IDD_OUTCHK,&amp;m_tab);
    dlg9.Create(IDD_OUTSIDE,&amp;m_tab);

    //表示の初期化
    dlg1.SetWindowPos(&amp;wndTop,0,0,0,0, SWP_NOSIZE | SWP_SHOWWINDOW);
    dlg2.SetWindowPos(&amp;wndTop,0,0,0,0, SWP_NOSIZE | SWP_HIDEWINDOW);
    dlg3.SetWindowPos(&amp;wndTop,0,0,0,0, SWP_NOSIZE | SWP_HIDEWINDOW);
    dlg4.SetWindowPos(&amp;wndTop,0,0,0,0, SWP_NOSIZE | SWP_HIDEWINDOW);
    dlg5.SetWindowPos(&amp;wndTop,0,0,0,0, SWP_NOSIZE | SWP_HIDEWINDOW);
    dlg6.SetWindowPos(&amp;wndTop,0,0,0,0, SWP_NOSIZE | SWP_HIDEWINDOW);
    dlg7.SetWindowPos(&amp;wndTop,0,0,0,0, SWP_NOSIZE | SWP_HIDEWINDOW);
    dlg8.SetWindowPos(&amp;wndTop,0,0,0,0, SWP_NOSIZE | SWP_HIDEWINDOW);
    dlg9.SetWindowPos(&amp;wndTop,0,0,0,0, SWP_NOSIZE | SWP_HIDEWINDOW);
    </text>
  </tips>

  <tips>
    <date>2003/06/23</date>
    <title><linkURL url="#0006">複数コントロールのイベントハンドラ作成</linkURL></title>
    <target>Visual C++</target>
    <text>
コントロールIDで(=2001など)数値を連番で指定

DoDataExchange()の下部のマクロに手書きでON_CONTROL_RANGEを追加

BEGIN_MESSAGE_MAP(CNumDlg, CDialog)
    (省略)
    ON_CONTROL_RANGE(BN_CLICKED,IDC_NUM0,IDC_NUM9,OnNum)
END_MESSAGE_MAP()
    </text>
  </tips>

  <tips>
    <date>2003/03/31</date>
    <title><linkURL url="#0007">EditBoxのalign指定が反映されない</linkURL></title>
    <target>eMbedded Visual C++</target>
    <text>
プロパティで複数行をチェックすることで回避可能
    </text>
  </tips>

  <tips>
    <date>2003/03/31</date>
    <title><linkURL url="#0015">ListCtrlの罫線表示が異常</linkURL></title>
    <target>eMbedded Visual C++</target>
    <text>
プロパティでカラムボタンを使用しないにチェックすることで回避可能
若しくはオーナードローで罫線を描画
    </text>
  </tips>

  <tips>
    <date>2003/03/31</date>
    <title><linkURL url="#0008">ハードウェアボタンの検出</linkURL></title>
    <target>eMbedded Visual C++ PocketPC2002</target>
    <text>
getForeGroundWindow()はMFCによってオーバーロードされるため
::getForeGroundWindow()として使用する。
    </text>
  </tips>

  <tips>
    <date>2003/03/31</date>
    <title><linkURL url="#0009">表示されるダイアログが全画面になる</linkURL></title>
    <target>eMbedded Visual C++ PocketPC2002</target>
    <text>
PocketPC用のMFCの仕様。Win32APIを直接利用してプログラミングを行う。
    </text>
  </tips>

  <tips>
    <date>2003/03/31</date>
    <title><linkURL url="#0010">atoi()にLPCTSTR型の引数が使用できない(eVC)</linkURL></title>
    <target>eMbedded Visual C++</target>
    <text>
eVCの仕様。さらに(char*)でキャストを行う。
例:(char*)(LPCTSTR)str //strはCString型
    </text>
  </tips>

  <tips>
    <date>2003/03/31</date>
    <title><linkURL url="#0011">ダイアログアプリケーションでのファイル入出力</linkURL></title>
    <target>Visual C++</target>
    <text>
C/C++言語のファイル入出力関数を利用する
    </text>
  </tips>

  <tips>
    <date>2003/04/10</date>
    <title><linkURL url="#0012">ハードウェアボタンの無効化</linkURL></title>
    <target>eMbedded Visual C++ PocketPC2002</target>
    <text>
GameAPI(DirectXのサブセット)を使用
    </text>
  </tips>

  <tips>
    <date>2003/03/31</date>
    <title><linkURL url="#0013">フォームの背景色を変更</linkURL></title>
    <target>Visual C++</target>
    <text>
WM_CTLCOLORのイベントハンドラOnCtlColor()を作成
例：
HBRUSH CSTART01Dlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
{
    HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
    
    // TODO: この位置で DC のアトリビュートを変更してください
    switch(nCtlColor){
    case CTLCOLOR_STATIC:
        // カウントアップ表示部分
        if((pWnd->m_hWnd==GetDlgItem(IDC_DISPLAY1)->m_hWnd)||
            (pWnd->m_hWnd==GetDlgItem(IDC_DISPLAY2)->m_hWnd)||
            (pWnd->m_hWnd==GetDlgItem(IDC_DISPLAY3)->m_hWnd)||
            (pWnd->m_hWnd==GetDlgItem(IDC_DISPLAY4)->m_hWnd)){

            pDC->SetTextColor(RGB(255,255,255)); // テキスト白(RGB(赤,緑,青))
            pDC->SetBkColor(RGB(0,0,0)); //背景黒
            m_DlgColor.CreateSolidBrush(RGB(0,0,0));
            return (HBRUSH)m_DlgColor;
        }
        // 項目設定定義部分
        else if(//(pWnd->m_hWnd==GetDlgItem(IDC_TERMINAL_ID)->m_hWnd)||
            (pWnd->m_hWnd==GetDlgItem(IDC_SETTEI1)->m_hWnd)||
            (pWnd->m_hWnd==GetDlgItem(IDC_SETTEI2)->m_hWnd)||
            (pWnd->m_hWnd==GetDlgItem(IDC_SETTEI3)->m_hWnd)||
            (pWnd->m_hWnd==GetDlgItem(IDC_SETTEI4)->m_hWnd)){

            pDC->SetTextColor(RGB(0,0,0)); // テキスト黒
            pDC->SetBkColor(RGB(255,255,255)); //背景白
            m_DlgColor.CreateSolidBrush(RGB(255,255,255));
            return (HBRUSH)m_DlgColor;
        }
        // 枠の内部
        else if((pWnd->m_hWnd==GetDlgItem(IDC_FRAME1)->m_hWnd)||
            (pWnd->m_hWnd==GetDlgItem(IDC_FRAME2)->m_hWnd)||
            (pWnd->m_hWnd==GetDlgItem(IDC_FRAME3)->m_hWnd)||
            (pWnd->m_hWnd==GetDlgItem(IDC_FRAME4)->m_hWnd)){

            pDC->SetTextColor(RGB(0,0,0)); // テキスト黒
            pDC->SetBkColor(RGB(255,255,153)); //背景黄色
            m_DlgColor.CreateSolidBrush(RGB(255,255,153));
            return (HBRUSH)m_DlgColor;
        }
        else{
            pDC->SetTextColor(RGB(255,255,255)); // テキスト白 
            pDC->SetBkColor(RGB(0,90,0)); // 背景緑
            m_DlgColor.CreateSolidBrush(RGB(0,90,0));
            return (HBRUSH)m_DlgColor;
        }
        break;
    case CTLCOLOR_BTN:
        pDC->SetTextColor(RGB(70,70,70));
        pDC->SetBkColor(RGB(230,230,230));
        m_DlgColor.CreateSolidBrush(RGB(230,230,230));
        return (HBRUSH)m_DlgColor;
/*    case CTLCOLOR_EDIT:
        pDC->SetTextColor(RGB(0,0,0)); // テキスト黒
        //hbr = (HBRUSH) m_DlgColor;     // 背景白
        pDC->SetBkColor(RGB(255,255,255)); //背景白
        return hbr;*/
    default:
        m_DlgColor.CreateSolidBrush(RGB(0,90,0)); // 背景緑
        return (HBRUSH)m_DlgColor;
    }
    // TODO: デフォルトのブラシが望みのものでない場合には、違うブラシを返してください
    return hbr;
}
    </text>
  </tips>


  <tips>
    <date>2003/07/10</date>
    <title><linkURL url="#0020">[×]ボタンをアプリケーション終了に改造</linkURL></title>
    <target>eMbedded Visual C++ / PocketPC2002</target>
    <text>
　PocketPCアプリケーションでは[ok]がアプリケーションの終了、[×]が最小化に設定されており
デスクトップアプリケーションと異なる動作をします。

アプリケーションによっては常にメモリに常駐していると問題のある場合もあり、特にSDIアプリ
ケーションでシステムメニューより終了させたい場合には次の改造を行います。

１．まず、[×]ボタンが押されたときのメッセージをspy++等で確認します。
　　その中にWM_SIZEがMainFrameに送られていることを確認してください。

２．次にClassWizardでメッセージハンドラの作成を行います。
　　すると以下のようなOnSizeメンバが作成されます。

　　void CMainFrame::OnSize(UINT nType, int cx, int cy) 
　　{
　　    CFrameWnd::OnSize(nType, cx, cy);	
　　    // TODO: Add your message handler code here
　　}

３．ここに終了処理を追加します。
　　OnSizeメンバの第一引数(nType)に変更するウィンドウの状態が入力されます。
　　入力される内容の一覧は以下のようになります。

　　SIZE_MAXIMIZED ウィンドウは最大表示されます。
　　SIZE_MINIMIZED ウィンドウはアイコン化されます。
　　SIZE_RESTORED  ウィンドウはサイズ変更されますが、SIZE_MINIMIZED と SIZE_MAXIMIZED は適用されません。
　　SIZE_MAXHIDE   ほかのウィンドウが最大表示されたとき、すべてのポップアップ ウィンドウにメッセージが送られます。
　　SIZE_MAXSHOW   ほかのウィンドウが元のサイズに戻されたとき、すべてのポップアップ ウィンドウにメッセージが送られます。

　　この中で最小化を判別してアプリケーションを終了させるためSIZE_MINIMIZEDが送られた場合の処理を分岐します。
　　その処理の中で以下のようにDestroyWindow()を呼び出すことでアプリケーションを終了させることができます。

　　void CMainFrame::OnSize(UINT nType, int cx, int cy) 
　　{
　　    CFrameWnd::OnSize(nType, cx, cy);
　　    // TODO: Add your message handler code here
　　    if(nType == SIZE_MINIMIZED){
　　        DestroyWindow();
　　        return;
　　    }
	
　　}
    </text>
  </tips>


</root>

