Visual C++


※上記の広告は60日以上更新のないWIKIに表示されています。更新することで広告が下部へ移動します。

  • ENTERキー、ESCキーでアプリが終了しないようにする。
クラスビューでCXXXDlgを選択し、プロパティ-のオーバーライドボタンをクリック
PreTranslateMessageをオーバーライドする。
BOOL CXXXDlg::PreTranslateMessage(MSG* pMsg)
{
	if(pMsg->message == WM_KEYDOWN){
		if(pMsg->wParam == VK_ESCAPE) return true;
		if(pMsg->wParam == VK_RETURN) return true;
	}
	return CDialog::PreTranslateMessage(pMsg);
}

  • モードレスダイアログ
1. リソースエディタで新規ダイアログを作成
 IDを IDD_XX_DIALOG とします。
2. クラスウィザードで新規クラスの作成
 クラス名を CXXDialog とします。
3. OnCancel()を変更
 void CXXDialog::OnCancel()
 {
   DestroyWindow();
 }
4. PostNcDestroy()を作成
 void CXXDialog::PostNcDestroy()
 {
   delete this;
 }
5. 呼び出し
 CXXDialog* dlg= new CXXDialog;
 dlg->Create(IDD_XX_DIALOG,this);
 dlg->ShowWindow(SW_SHOW);

  • CXXXAppのメンバーにアクセスする
 CXXXApp *app = (CXXXApp*)AfxGetApp();
 app->m_xxx = ...
もしくは、
 extern CXXXApp theApp;
 theApp.m_xxx = ...

  • CString⇔char*
 CString msg;
 char str[10];

 msg.Format("%s", str);
 sprintf_s(str, sizeof(str), "%s", msg);

  • DoEvents()
void DoEvents()
{
	MSG msg;

	while(::PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)){
		::TranslateMessage(&msg);
		::DispatchMessage(&msg);
	}
}

 2つ以上USB挿してもおけ。
#pragma comment(lib, "setupapi.lib")
#include <setupapi.h>

int CtestDlg::GetUsbComPort(int port[])
{
	CString msg;
	DWORD i;
	BYTE Buffer[200];
	HDEVINFO hDevInfo = 0;
	SP_DEVINFO_DATA	DeviceInfoData;
	int ret_cnt;


	BYTE ComName[]="CP210x USB to UART Bridge Controller (COM";
	DWORD Length=0;

	ZeroMemory(&DeviceInfoData,sizeof(SP_DEVINFO_DATA));
	DeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
	
	//存在するデバイス情報を取得
	hDevInfo = SetupDiGetClassDevs(NULL,0,0,DIGCF_PRESENT|DIGCF_ALLCLASSES);

	ret_cnt = 0;
	for(i=0; SetupDiEnumDeviceInfo(hDevInfo,i,&DeviceInfoData); i++){

		//デバイスのフレンドリーネームの取得
		if(!SetupDiGetDeviceRegistryProperty(hDevInfo,&DeviceInfoData,SPDRP_FRIENDLYNAME,NULL,Buffer,sizeof(Buffer),&Length)){
			// よく取得できない
			continue;
		}

		//指定したシリアルポートかどうかをコンペア
		if(strncmp((const char*)Buffer,(const char*)ComName,strlen((const char*)ComName))==0){
			CString tmp;
			tmp.Format("%s", Buffer+strlen((const char*)ComName));
			tmp = tmp.Left(tmp.GetLength()-1);
			port[ret_cnt] = atoi(tmp);
			ret_cnt++;

 			msg.Format("%s%s\n", msg, Buffer);
		}
	}
	SetupDiDestroyDeviceInfoList(hDevInfo);

	m_static1.SetWindowText(msg);

	return ret_cnt;
}

  • ウィンドウを最前面
SetWindowPos(&wndTopMost, 0,0,0,0, SWP_NOSIZE|SWP_NOMOVE|SWP_NOACTIVATE);

  • 警告音を鳴らす
MessageBeep( MB_OK );

(1)標準的な警告音(-1)
(2)一般の警告音(MB_OK)
(3)情報メッセージ音(MB_ICONASTERISK)
(4)問い合わせメッセージ音(MB_ICONQUESTION)
(5)警告メッセージ音(MB_ICONEXCLAMATION)
(6)システムエラー音(MB_ICONHAND)

  • プリコンパイル済みヘッダーファイル(stdafx.h)
プリコンパイル済みヘッダーファイルが不要なソースコードの場合、
そのファイルのみ不要の設定を行うことができる。( .cファイルなど)

ソリューションエクスプローラのファイルを選択し、
プロパティ→C/C++→プリコンパイル済みヘッダー→プリコンパイル済みヘッダーを使用しない

  • SDK時にTRACE(DebugPrint)する
http://www5b.biglobe.ne.jp/~kouta_y/c/c06.html
出力はイミディエイトウィンドウではなくて出力ウィンドウに出力される。

  • このアプリケーションの構成が正しくないため・・・の対処方法
A.下記をインストールする
  http://www.microsoft.com/downloads/details.aspx?FamilyID=200b2fd9-ae1a-4a14-984d-389c36f85647&DisplayLang=ja
B.プロジェクトのプロパティを変更する。
  「構成プロパティ」の中の「C/C++」の中、「コード生成」を選択
  マルチスレッドDLL→マルチスレッド(/MT)に変更する。
                              (gn_commはスレッドを使っているのでランタイム必要)

外部リンク