class C…Dialog : public CDialog
{
// 構築
public:
C…Dialog(CWnd* pParent = NULL); // 標準のコンストラクタ
// ダイアログ データ
//{{AFX_DATA(C…Dialog)
enum { IDD = IDD_…_DIALOG };
CString m_resCH[MAX_CH];
// メモ: この位置に ClassWizard によってデータ メンバが追加されます。
//}}AFX_DATA
…
}
void C…Dialog::DoDataExchange(CDataExchange* pDX)
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(C…Dialog)
int Cnt;
for(Cnt = 0; Cnt < MAX_CH; Cnt++)
DDX_Text(pDX, IDC_RES_CH1+Cnt, m_resCH[Cnt]);
// メモ: この場所には ClassWizard によって DDX と DDV の呼び出しが追加されます。
//}}AFX_DATA_MAP
}
for(int Cnt = 0; Cnt < MAX_CH; Cnt++)
m_resCH[Cnt] = GetResultStr(SmpData[Cnt]);
UpdateData(FALSE);
◆配列の定義をすると、ClassWizardが起動できなくなるので、その場合はクラスの型定義とデータのやり取りしている(DDX_Textを呼び出している)ところをコメントにして、ClassWizardで定義してから、コンパイルする前にコメントをはずす。このとき、コメントは「//」で行コメントにしたほうがよいみたい。
Cxxx *cxxxptr;
cxxxptr = new Cxxx; //引数なしの場合
または
cxxxptr = new Cxxx(初期値); //ポインタ = new コンストラクタ(引数);
↓
delete cxxxptr
char *ptr;
ptr = new char[10];
↓
delete[ ] ptr;
//deleteだけだと、配列の先頭しか解放されない
MSG msg;
if (::PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) {
::TranslateMessage(&msg);
::DispatchMessage(&msg);
}
◆マウスポインタを砂時計にしても、上の処理を行うと、標準のポインタに戻ってしまうらしい。
◆コントロールパネルで設定してある音が再生される。
char fullpath[_MAX_PATH], drive[_MAX_DRIVE], dir[_MAX_PATH];
fname[_MAX_FNAME], ext[_MAX_EXT];
//起動パスの取得
GetModuleFileName(NULL, fullpath, sizeof(fullpath));
_splitpath(fullpath, drive, dir, fname, ext);
BOOL CXXXXXDlg::PreTranslateMessage(MSG* pMsg)
{
//ENTERキーを無効にする
if ((pMsg->message == WM_KEYDOWN) && (pMsg->wParam == 0xd))
return 0;
return CDialog::PreTranslateMessage(pMsg);
}
CTime dt( 2005, 9, 30, 22, 15, 0 ); // 10:15PM September 30,2005
CString s = dt.Format( "%A, %B %d, %Y" ); // "Friday,September 30, 2005"
if(dt.GetDay() >= 20)
…
◆mmsystem.hのインクルードと、winmm.libのリンクが必要(「プロジェクト」メニューの「設定」を選択し、「リンク」タブの「オブジェクト/ライブラリモジュール」に「winmm.lib」と追加入力する)。
◆しかし…結局Windows2000とXPのタイマ精度は10msecみたいだな。(T_T)期待はずれでした。
CTime Time1(2006, 2, 7, 17, 0, 0);
CTime Time2 = CTime::GetCurrentTime();
CTimeSpan TS1 = Time2 - Time1; //時間の差を求める
LONG Sec = TS1.GetTotalSeconds(); //秒数に換算
CTimeSpan TS2(0, 0, 0, 30, 0) //30分
Time1 = Time2 + TS2; //Time1はTime2の30分後の時間
#include <stdlib.h>
…
srand((unsigned)time(NULL)); //初期値設定
int rnum, Cnt;
for(Cnt = 0; Cnt < 20; Cnt++){
rnum = rand(); //ランダムな数値
…
}
定数 | 値 | 説明 |
SCHAR_MAX | 127 | signed char の最大値 |
SCHAR_MIN | -128 | signed char の最小値 |
CHAR_BIT | 8 | char のビット数 |
UCHAR_MAX | 255(0xff) | unsigned char の最大値 |
USHRT_MAX | 65535(0xffff) | unsigned short の最大値 |
SHRT_MAX | 32767 | (signed) short の最大値 |
SHRT_MIN | -32768 | (signed) short の最小値 |
UINT_MAX | 4294967295(0xffffffff) | unsigned int の最大値 |
ULONG_MAX | 4294967295(0xffffffff) | unsigned long の最大値 |
INT_MAX | 2147483647 | (signed) int の最大値 |
INT_MIN | -2147483648 | (signed) int の最小値 |
LONG_MAX | 2147483647 | (signed) long の最大値 |
LONG_MIN | -2147483648 | (signed) long の最小値 |
DBL_MAX | 1.7976931348623158e+308 | doubleの最大値 |
DBL_MIN | 2.2250738585072014e-308 | doubleの最小の正の値 |
DBL_DIG | 15 | doubleの10進精度の桁数 |
DBL_MANT_DIG | 53 | doubleの仮数部のビット数 |
DBL_MAX_10_EXP | 308 | doubleの最大の 10進の指数 |
DBL_MIN_10_EXP | (-307) | doubleの最小の 10進の指数 |
FLT_MAX | 3.402823466e+38F | floatの最大値 |
FLT_MIN | 1.175494351e-38F | floatの最小の正の値 |
FLT_DIG | 6 | floatの10進精度の桁数 |
FLT_MANT_DIG | 24 | floatの仮数部のビット数 |
FLT_MAX_10_EXP | 38 | floatの最大の 10進の指数 |
FLT_MIN_10_EXP | (-37) | floatの最小の 10進の指数 |
◆指数表示 仮数×(基数の指数乗)
◆使用するには、以下のインクルードが必要だな。
#include <limits.h>//double、float関係以外
#include <float.h>//doubleとかfloat関係
LARGE_INTEGER Freq, StTime, CurTime;
QueryPerformanceFrequency(&Freq); //
QueryPerformanceCounter(&StTime);
… //計測したい処理
QueryPerformanceCounter(&CurTime);
msec = CurTime.QuadPart - StTime.QuadPart) * 1000 / Freq.QuadPart; //かかったミリ秒
// CXXXXXApp
BEGIN_MESSAGE_MAP(CXXXXXApp, CWinApp)
//{{AFX_MSG_MAP(CXXXXXApp)
// メモ - ClassWizard はこの位置にマッピング用のマクロを追加または削除します。
// この位置に生成されるコードを編集しないでください。
//}}AFX_MSG
// ON_COMMAND(ID_HELP, CWinApp::OnHelp)
END_MESSAGE_MAP()
typedef struct{
…
SAMPLE_DATA;
…
CPtrList DataList;
…
SAMPLE_DATA *pData = (SAMPLE_DATA *)DataList.GetAt(DataList.FindIndex(Idx));
CFile DataFile;
DataFile.Open(FilePath, CFile::modeCreate | CFile::modeWrite); //ファイルオープン
POSITION Pos = DataList.GetHeadPosition(); //先頭ポジション取り出し
SAMPLE_DATA *pData;
while(Pos != NULL){
pData = (SAMPLE_DATA *)DataList.GetNext(Pos); //次のデータポジション取得
DataFile.Write(pData, sizeof(SAMPLE_DATA));
}
DataFile.Close(); //ファイルクローズ
POSITION Pos1, Pos2;
SAMPLE_DATA *pData;
for(Pos1 = DataList.GetHeadPosition(); (Pos2 = Pos1) != NULL; ){
DataList.GetNext(Pos1); //次のデータ
pData = (SAMPLE_DATA *)DataList.GetAt(Pos2); //データのポインタ取得
DataList.RemoveAt(Pos2); //リストからポインタを削除
delete pData; //データのメモリを解放
}
CFile DataFile;
DataFile.Open(FilePath, CFile::modeRead);
SAMPLE_DATA *pData;
while(true){
pData = new SAMPLE_DATA;
if(pData == NULL){
break;
}
if(DataFile.Read(pData, sizeof(SAMPLE_DATA)) != sizeof(SAMPLE_DATA)){
delete pData;
break;
}
DataList.AddTail(pData);
}
DataFile.Close();
定義 | 説明 |
BOOL | ブール値 |
BSTR | 32 ビットの文字ポインタ |
BYTE | 8 ビットの符号なし整数 |
COLORREF | カラー値として使われる 32 ビット値 |
DWORD | 32 ビットの符号なし整数、またはセグメントアドレスとそれに関連するオフセット |
LONG | 32 ビットの符号付き整数 |
LPARAM | ウィンドウ プロシージャまたはコールバック関数の引数として渡される 32 ビット値 |
LPCSTR | 定数文字列への 32 ビット ポインタ |
LPSTR | 文字列への 32 ビット ポインタ |
LPCTSTR | Unicode と DBCS への移植性が高い定数文字列への 32 ビット ポインタ |
LPCRECT | 定数の (変更不可能な) RECT 構造体への 32 ビット ポインタ |
LPTSTR | Unicode と DBCS への移植性が高い文字列への 32 ビット ポインタ |
LPVOID | 型指定のない 32 ビット ポインタ |
LRESULT | ウィンドウ プロシージャまたはコールバック関数から返される 32 ビット値 |
POSITION | コレクションの要素の位置を表すために使われる値 |
UINT | Windows Versions 3.0 と 3.1 では、16 ビット符号なし整数。Win32 では、32 ビット符号なし整数 |
WNDPROC | ウィンドウ プロシージャへの 32 ビット ポインタ |
WORD | 16 ビットの符号なし整数 |
WPARAM | ウィンドウ プロシージャまたはコールバック関数への引数として渡される値 |
関数定義 | 説明 |
int abs(int); | 整数値の絶対値 |
double acos(double); | アークコサイン(ラジアン単位) |
double asin(double); | アークサイン(ラジアン単位) |
double atan(double); | 角度に対するアークタンジェント(ラジアン単位) |
double atan2(double, double); | XYに対するアークタンジェント |
double ceil(double); | 繰上げ |
double cos(double); | 角度に対するコサイン(ラジアン単位) |
double cosh(double); | ハイパーボリックコサイン(ラジアン単位) |
double exp(double); | 指数計算 |
double fabs(double); | 浮動小数点実数の絶対値 |
double floor(double); | 引数の値を越えない最大の整数 |
double fmod(double, double); | 浮動小数点数の剰余(割られる数、割る数) |
double frexp(double, int *); | 浮動小数点実数を仮数(戻り値)と指数に分ける |
long labs(long); | longの絶対値 |
double ldexp(double x, int e); | 仮数と指数から実数を計算(2をe乗してx倍) |
double log(double); | 自然対数 |
double log10(double); | 常用対数 |
double modf(double, double *); | 浮動小数点実数を整数と小数部分(戻り値)に分ける |
double pow(double x, double y); | べき乗(xのy乗) |
double sin(double); | サイン(ラジアン単位) |
double sinh(double); | ハイパーボリックサイン(ラジアン単位) |
double sqrt(double); | 平方根(正の値を指定する) |
double tan(double); | タンジェント(ラジアン単位) |
double tanh(double); | ハイパーボリックタンジェント(ラジアン単位) |
◆使うときは#include <math.h>が必要。
void MakeString(LPTSTR pStr){
…
}
void DispString(LPCTSTR pStr){
…
}
//↑なんて関数があったとき…
CString ParamStr;
MakeString(ParamStr.GetBuffer(20)); //文字列バッファのポインタを渡す必要がある
DispString(ParamStr); //そのまま渡せる
定義 | 意味 |
_MAX_DIR | ディレクトリ名の最大長 |
_MAX_DRIVE | ドライブ名の最大長 |
_MAX_EXT | 拡張子の最大長 |
_MAX_FNAME | ファイル名の最大長 |
_MAX_PATH | 絶対パスの最大長 |
TCHAR FilePath[_MAX_PATH];//取得したパス名格納域
if(GetEnvironmentVariable(環境変数文字列, PathStr, _MAX_PATH)){
・・・
}
環境変数 | パス |
ALLUSERSPROFILE | C:\Documents and Settings\All Users(XP) C:\ProgramData(7) |
APPDATA | C:\Documents and Settings\%USERNAME%\Application Data(XP) C:\Users\%USERNAME%\AppData\Roaming(7) |
CommonProgramFiles | C:\Program Files\Common Files |
HOMEDRIVE SYSTEMDRIVE |
C: |
HOMEPATH | C:\Documents and Settings\%USERNAME%(XP) \Users\%USERNAME%(7) |
SYSTEMROOT WINDIR |
C:\WINDOWS |
TEMP | C:\Documents and Settings\%USERNAME%\Local Settings\Temp(XP) C:\Users\%USERNAME%\AppData\Local\Temp(7) |
USERPROFILE | C:\Documents and Settings\%USERNAME%(XP) C:\Users\%USERNAME%(7) |
USERNAME | ログオンしているユーザー名 |
char FilePath[_MAX_PATH];//取得したパス名格納域
if(SUCCEEDED(SHGetFolderPath(NULL,
CSIDL_COMMON_APPDATA★, NULL, 0,FilePath))){
PathStr.Format("%s\\", FilePath);//取得したパスの最後に\を追加
}
変換内容 | 関数定義 | マルチバイトでもUNICODEでも同じ記述 |
文字列をdoubleに変換 | double atof( const char *string ); double _wtof( const wchar_t *string ); |
double _ttof( const TCHAR *string ); |
文字列をintに変換 | int atoi( const char *string ); int _wtoi( const wchar_t *string ); |
int _ttoi( const TCHAR *string ); |
文字列をlongに変換 | long atol( const char *string ); long _wtol( const wchar_t *string ); |
long _ttol( const TCHAR *string ); |
doubleを文字列に変換 | char *_ecvt( double value, int count,//文字列の桁数 int *dec,//小数点位置 int *sign//0:正の値 ); char *_fcvt( double value, int count,//小数点以下の桁数 int *dec,//小数点位置 int *sign//0:正の値 ); |
|
整数を文字列に変換 | char *_itoa( int value, char *string, int radix//基数(2〜36) ); wchar_t * _itow( int value, wchar_t *string, int radix//基数(2〜36) ); |
TCHAR *_itot( int value, TCHAR *string, int radix//基数(2〜36) ); |
変換内容 | 関数定義 |
マルチバイト文字列をワイド文字列に変換 | size_t mbstowcs( wchar_t *wcstr,//ワイド文字列 const char *mbstr, size_t count//マルチバイト文字数 ); int mbtowc( wchar_t *wchar, const char *mbchar, size_t count ); |
ワイド文字列をマルチバイト文字列に変換 | size_t wcstombs( char *mbstr, const wchar_t *wcstr, size_t count ); int wctomb( char *mbchar, wchar_t wchar ); |
◆そんなことしなくても、CStringとCStringAを使えば簡単みたいだ。
CStringA StrA = "abc";
CString Str1 = CString(StrA);とか
CString Str2(StrA);とか
その逆でもOKだ。
CString Str = _T("ABC");
CStringA StrA = CStringA(Str);
AfxGetApp()->m_lpCmdLine
たとえば、 "*.exe A B C"と起動した場合、"A B C"という文字列を取得できる。なので自分で分解が必要。__argc(int型)
__targv(tchar **)
CStringArray ParamArray;
for(int Cnt = 1; Cnt < __argc; Cnt++){
ParamArray.Add(__targv[Cnt]);
}
//ウィンドウステーションのハンドル取得
HWINSTA WHandle = GetProcessWindowStation();
if(マウスクリップする?){
//画面にマウスクリップ設定
CRect Rct, Rct2;
GetWindowRect(&Rct);
if(ClipCursor(&Rct)){
GetClipCursor(&Rct2);
}
}else{
//解除
ClipCursor(NULL);
}
//接続ドライブ一覧をメッセージボックスで表示例
DWORD dwDrive = GetLogicalDrives();
CString ListStr = _T("接続ドライブ ");
CStringA WStr;
for(int DCnt = 0 ; DCnt < 26 ; DCnt++ ){
if(dwDrive & (1 << DCnt)){//ビットで接続有無確認
WStr.Format("%C:\\ ", DCnt + TEXT('A'));
ListStr += CString(WStr);
}
}
AfxMessageBox(ListStr);