#include <commctrl.h>
#pragma comment(lib, "Comctl32.lib")
warning C4996: 'strcpy' が古い形式として宣言されました。
- strcpy(line,"ABC"); → strcpy_s(line,255,"ABC");
- sprintf(line,"%s","ABC"); → sprintf_s(line,255,"%s","ABC");
- sscanf(str,"%lf",&f); → sscanf_s(str,"%lf",&f); →これって何の意味があるんだろうね。
char line[] = "ABC"; // という記述を
WCHAR line[] = L"ABC"; // に変更すれば良いみたい
LPWSTR wchar(LPWSTR wline, char *line)
{
MultiByteToWideChar(CP_ACP,0,line,-1,wline,(int)strlen(line)+1);
return(wline);
}
#ifdef UNICODE
#define DLL関数名 UniCode関数名
#else
#define DLL関数名 MultiByte関数名
#endif
int APIENTRY _tWinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
MyRegisterClass(hInstance); // ウィンドウクラスの定義
InitInstance (hInstance, nCmdShow) // アプリケーションの初期化
// メイン メッセージ ループ:
while (GetMessage(&msg, NULL, 0, 0))
{
if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg); // これでWndProcへメッセージが送られる
}
}
return (int) msg.wParam;
}
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
g.hInst = hInstance; // グローバル変数にインスタンス処理を格納します。
hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
:
:
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp)
{
switch (msg) //メッセージにより処理を行うだけ
{
case WM_CREATE: // メッセージ処理を並べる
:
case WM_COMMAND:
:
}
}
// ---- mystd.h -- my standard setting by K.I
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <time.h>
#include <setjmp.h>
#include <process.h>
#include <commctrl.h>
#pragma comment(lib, "Comctl32.lib")
#include "chara.h" // 自分用関数ライブラリ
// ---- for string
typedef char str255[256];
:
他にもあるけど省略。
:
LRESULT SendMessage(
HWND hWnd, // Windowのハンドル
UINT Msg, // メッセージ
WPARAM wParam, // Wパラメータ
LPARAM lParam // Lパラメータ
);
SendMessage(GetDlgItem(hDialog, IDC_CONTROL1), UDM_SETPOS, 0, (LPARAM)MAKELONG(value, 0));
typedef struct {
// ---- handle ----
HWND hMain; // メインウィンドウのハンドル
HINSTANCE hInst; // メインウィンドウのインスタンス
HWND hDlg0, hDlg1, hDlg2, hDlg3; // 子ダイアログのハンドル
long dlg0x, dlg0y, dlg1x, dlg1y; // 子ダイアログの大きさ
HMENU hMenu;
HWND hSbar; // ステータスバー
HBITMAP hBitmap; // オフスクリーンビットマップ
HDC hBuffer; // ダブルバッファ
:
:
} globaldata;
globaldata g;
ファイル(&F)
wcex.lpszMenuName = MAKEINTRESOURCE(IDR_MENU1);
case WM_COMMAND:
switch (LOWORD(wp)) {
case IDM_CHECK:
state = GetMenuState(g.hMenu,IDM_CHECK,MF_BYCOMMAND);
if (state&MF_CHECKED) {
CheckMenuItem(g.hMenu,IDM_CHECK,MF_UNCHECKED|MF_BYCOMMAND);
}
else {
CheckMenuItem(g.hMenu,IDM_CHECK,MF_CHECKED|MF_BYCOMMAND);
}
break;
case IDM_EXIT:
PostMessage(hWnd,WM_CLOSE,wp,lp);
break;
default:
return DefWindowProc(hWnd, message, wp, lp);
}
break;
HMENU hMenu = GetMenu(hWnd);
#include <commctrl.h>
#pragma comment(lib, "Comctl32.lib")
static int sb_size[] = { 100 , 200 , -1 };
case WM_CREATE:
InitCommonControls();
hSbar = CreateStatusWindow(
WS_CHILD | WS_VISIBLE |
CCS_BOTTOM | SBARS_SIZEGRIP ,
(LPCWSTR)"sTaTus" , hWnd , 1
);
SendMessage(hSbar, SB_SETPARTS, 3, (LPARAM)sb_size);
SendMessage(hSbar, SB_SETTEXT, 0 | n, (LPARAM)line);
case WM_SIZE:
SendMessage(g.hSbar, WM_SIZE, wp, lp);
case WM_SIZE:
sb_size[2] = LOWORD(lp); // 右端
sb_size[1] = LOWORD(lp) - 100; // 中央
sb_size[0] = LOWORD(lp) - 200; // 左端
SendMessage(hSbar, SB_SETPARTS, 3, (LPARAM)sb_size);
SendMessage(g.hSbar, WM_SIZE, wp, lp);
hCombo = GetDlgItem(hwnd,comboid);
for (i=0; i<5 ;i++) {
SendMessage(hCombo,CB_INSERTSTRING,i,(LPARAM)list[i]);
}
SendMessage(hCombo,CB_SETCURSEL,0,0); // 仮に最初の項目を選択
case WM_COMMAND:
switch (LOWORD(wp))
{
case IDC_COMBO:
index = SendMessage(hCombo,CB_GETCURSEL,0,0);
break;
default:
return FALSE;
}
break;
SendMessage(GetDlgItem(hDlg,IDC_COMMAND),WM_SETTEXT,0,(LPARAM)line);
或は SendDlgItemMessage(hDlg,IDC_COMMAND,WM_SETTEXT,0,(LPARAM)line);
SendDlgItemMessage(hDlg,IDC_COMMAND,WM_GETTEXT,sizeof(line),(LPARAM)line);
case WM_CTLCOLORSTATIC:
// --- コントロールの文字に色を付ける
if( GetDlgItem( g.hDlg0,IDC_SENSOR0_C) == (HWND)lp) {
SetTextColor( (HDC)wp, RGB( 255, 255, 255)) ;
SetBkColor( (HDC)wp, RGB(255,0,0)) ;
return (BOOL)(HBRUSH)GetStockObject(NULL_BRUSH) ;
}
:
:
static HFONT hFont;
:
case WM_INITDIALOG:
// PANELの初期設定
hFont = SetMyFont("MS ゴシック", 40, 0);
SendMessage(GetDlgItem(hdlg,IDC_STATIC1),WM_SETFONT,
(WPARAM)hFont,(LPARAM)FALSE);
break;
:
HFONT SetMyFont(LPCTSTR face, int h, int angle)
{
HFONT hFont;
hFont = CreateFont(h, //フォント高さ
0, //文字幅
angle, //テキストの角度
0, //ベースラインとx軸との角度
FW_REGULAR, //フォントの重さ(太さ)
FALSE, //イタリック体
FALSE, //アンダーライン
FALSE, //打ち消し線
SHIFTJIS_CHARSET, //文字セット
OUT_DEFAULT_PRECIS, //出力精度
CLIP_DEFAULT_PRECIS, //クリッピング精度
PROOF_QUALITY, //出力品質
FIXED_PITCH | FF_MODERN, //ピッチとファミリー
face); //書体名
return hFont;
}
HFONT setFontSetting(HWND hWnd, int ctrlID, int height, int weight, int underline)
{
LOGFONT logfont;
HFONT hFont;
hFont = (HFONT)SendMessage(GetDlgItem(hWnd, ctrlID), WM_GETFONT, 0, 0);
GetObject(hFont, sizeof(logfont), &logfont);
logfont.lfHeight = height;
logfont.lfWeight = weight;
logfont.lfUnderline = underline;
hFont = CreateFontIndirect(&logfont);
SendDlgItemMessage(hWnd, ctrlID, WM_SETFONT, (WPARAM)hFont, 0);
return hFont;
}
// ---- メインのウィンドウを生成する
hWnd = CreateWindow("xxxMainClass", "xxx",
WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN,
0, 0, 600, 600,
NULL, NULL, hInst, NULL);
if (hWnd == NULL) {
GlobalCleanup();
return FALSE;
}
// ---- メインのウィンドウを表示
ShowWindow( hWnd, nShowCmd ) ;
UpdateWindow( hWnd ) ;
case WM_CREATE: //ウィンドウが開いたら
hChild = CreateDialog(hInst,MAKEINTRESOURCE(IDD_DIALOG1),hWnd,(DLGPROC)ChildProc);
ShowWindow(hChild, SW_SHOW);
UpdateWindow(hChild);
case WM_SIZE:
GetWindowRect(hWnd, &rt); // Windowサイズ取得
wx = rt.right - rt.left;
wy = rt.bottom - rt.top
GetClientRect(hWnd, &crt); // Windowの枠内のサイス取得
cx = crt.right - crt.left;
cy = crt.bottom - crt.top;
GetClientRect(hChild,&drt); // Dialogリソースのサイズ取得
dx = drt.right - drt.left;
dy = drt.bottom - drt.top;
MoveWindow(hWnd,0,0,wx,dy+(wy-cy),TRUE); //Windowの高さをDialogに合わせる
MoveWindow(hChild, 0, 0, dx, dy, TRUE); //左側にDialogを配置
BOOL CALLBACK ChildProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp)
{
switch (msg) {
case WM_INITDIALOG: // Window の初期化
return TRUE;
case WM_CLOSE: // Window を閉じる
ShowWindow(hWnd, SW_HIDE); // 実際は見えなくしているだけ
UpdateWindow(hWnd);
return TRUE;
case WM_SIZE: // Windowのサイズ変更
return TRUE;
case WM_COMMAND: // Window のコマンド処理
switch (LOWORD(wp)) {
case IDOK:
return TRUE;
case IDCANCEL:
return TRUE;
default:
return (DefWindowProc(hWnd, msg, wp, lp)); //処理しないものはシステムに渡す
}
}
return FALSE;
}
case IDM_ABOUT:
DialogBox(g.hInst, MAKEINTRESOURCE(IDD_ABOUT), hWnd, (DLGPROC)AboutDlgProc);
break;
// Aboutダイアログ表示
LRESULT CALLBACK AboutDlgProc(HWND hdlg, UINT msg, WPARAM wp, LPARAM lp)
{
switch (msg) {
case WM_INITDIALOG:
g.hAbout = hdlg;
DialogPrintf(hdlg,IDC_VERSION,VERSION);
return FALSE;
case WM_LBUTTONDOWN:
EndDialog(hdlg,IDOK);
break;
default:
return FALSE;
}
return TRUE;
}
case WM_GETMINMAXINFO:
MINMAXINFO FAR * lpmm;
lpmm = (MINMAXINFO FAR *)lp;
lpmm->ptMaxPosition.x = 0; // 最大表示時の位置
lpmm->ptMaxPosition.y = 0;
lpmm->ptMaxSize.x = 640; // 最大表示時のサイズ
lpmm->ptMaxSize.y = 480;
lpmm->ptMinTrackSize.x = 100; // 変更可能な最小サイズ
lpmm->ptMinTrackSize.y = 100;
lpmm->ptMaxTrackSize.x = 640; // 変更可能な最大サイズ
lpmm->ptMaxTrackSize.y = 480;
break;
case WM_CREATE:
// ---- タイマをセット(500ms)
SetTimer(hWnd,ID_MYTIMER,500,NULL); →タイマーIDを指定しておく
case WM_TIMER:
if (wp != ID_MYTIMER)
return(DefWindowProc(hWnd, msg, wp, lp));
:
タイマー処理を記述
:
GetCurrentDirectory( 255, dir ); // カレントディレクトリのパスを取得
sprintf(inifile,"%s\\%s",dir,"inifile.ini"); // INIファイルパスを作成
GetPrivateProfileString("SECTION","KEY","DEFAULT",para,255,inifile); // INIファイル読込み
WritePrivateProfileString("SECTION","KEY","PARA",inifile); // INIファイル書き込み
hdc=BeginPaint(hwnd,&ps);
:
描画
:
EndPaint(hwnd,&ps);
// ---- オフスクリーンを生成
g.hdc = GetDC(hWnd);
g.hBitmap = CreateCompatibleBitmap(g.hdc , g.bufx , g.bufy);
g.hBuffer = CreateCompatibleDC(g.hdc);
SelectObject(g.hBuffer , g.hBitmap);
SelectObject(g.hBuffer , GetStockObject(NULL_PEN));
PatBlt(g.hBuffer , 0 , 0 , g.bufx , g.bufy , WHITENESS);
ReleaseDC(hWnd , g.hdc);
g.hdc = BeginPaint(g.hMain, &ps);
BitBlt(g.hdc,0,0,g.bufx,g.bufy,g.hBuffer,0,0,SRCCOPY);
EndPaint(g.hMain, &ps);
long graph_x(double x) // データ座標xからスクリーン座標を求める
{
double xk;
xk = (srt.right-srt.left)/(drt.right-drt.left);
return((long)(xk*(x-drt.left)+srt.left));
}
long graph_y(double y) // データ座標yからスクリーン座標を求める
{
double yk;
yk = (srt.bottom-srt.top)/(drt.top-drt.bottom);
return((long)(yk*(y-drt.bottom)+srt.top));
}
#ifdef __cplusplus
# define DLLImport extern "C" __declspec( dllimport )
# define DLLExport extern "C" __declspec( dllexport )
#else
# define DLLImport __declspec( dllimport )
# define DLLExport __declspec( dllexport )
#endif
DLLExport void __stdcall dll_function(void);
DLLImport void __stdcall dll_function(void);
typedef void(*DLLFUNC)(void); //DLL関数の型を定義
HINSTANCE h_dll; //DLLのインスタンスハンドル
DLLFUNC dll_function; //DLL関数のアドレス
if (NULL == (h_dll=LoadLibrary("dll_function.dll"))) //DLLのロード
DLL読み込み失敗!
dll_function = (DLLFUNC)GetProcAddress(h_dll,"dll_function"); //DLL関数のアドレスを求める
dll_function(); //DLL関数を使う
if (!FreeLibrary(h_dll)) //DLLを開放する
DLL開放失敗!
void threadfunction(void *); →呼出す関数の引数はvoid*にする必要がある(081024追記)
_beginthread(threadfunction, 0, NULL);
_endthread();
// ---- Mutual Exclusion ----
#define SYNC_CRITICALSECTION
#ifdef SYNC_MUTEX // Mutexによる排他制御
#define crea_mutex(xxx) {xxx = CreateMutex( 0, FALSE, NULL);}
#define wait_mutex(xxx) {WaitForSingleObject( xxx, INFINITE );}
#define rele_mutex(xxx) {ReleaseMutex( xxx );}
#define clos_mutex(xxx) {CloseHandle(xxx);}
#endif
#ifdef SYNC_CRITICALSECTION // クリティカルセクションによる排他制御
#define crea_mutex(xxx) {InitializeCriticalSection( &xxx );}
#define wait_mutex(xxx) {EnterCriticalSection( &xxx );}
#define rele_mutex(xxx) {LeaveCriticalSection( &xxx );}
#define clos_mutex(xxx) {DeleteCriticalSection( &xxx );}
#endif
#ifdef SYNC_GLOBAL // グローバル変数による排他制御
#define crea_mutex(xxx) {xxx=0;}
#define wait_mutex(xxx) {while(xxx);xxx++;} //(誤動作注意!)
#define rele_mutex(xxx) {xxx=0;}
#define clos_mutex(xxx) {xxx=-1;}
#endif
// ---- zzzアクセス同期用Mutex変数
#ifdef SYNC_MUTEX
HANDLE zzzMutex;
#endif
#ifdef SYNC_CRITICALSECTION
CRITICAL_SECTION zzzMutex;
#endif
#ifdef SYNC_GLOBAL
long zzzMutex;
#endif
crea_mutex(zzzMutex); // Mutex初期化
:
wait_mutex(zzzMutex); // アクセス前にMutexを取得して、他のアクセスを禁止
// Mutexが使用中なら、開放されるまで待つ
:
ヤバイ変数へのアクセス
:
rele_mutex(zzzMutex); // Mutexを開放する
:
clos_mutex(zzzMutex); // Mutexを破棄する
typedef struct _OVERLAPPED {
ULONG_PTR Internal;
ULONG_PTR InternalHigh;
DWORD Offset;
DWORD OffsetHigh;
HANDLE hEvent;
} OVERLAPPED, *LPOVERLAPPED;
OVERLAPPED ol;
ZeroMemory( &ol, sizeof(ol) ); // まとめてゼロクリア
ol.Offset = 0; // 必要に応じてセット
ol.OffsetHigh = 0; // 必要に応じてセット
ol.hEvent = NULL; // 必要に応じてセット
BOOL GetOverlappedResult(HANDLE hFile, LPOVERLAPPED lpOverlapped, LPDWORD lpNumberOfBytesTransferred, BOOL bWait);
// ---- 非同期での読込み
if (ReadFile(g.hpipe,buffer,sizeof(buffer),&readsize,&g.overlap)) {
// -- 読込み完了
}
else {
if (GetLastError() != ERROR_IO_PENDING) {
// -- エラー
}
}
// ---- 読込み完了を確認
if (GetOverlappedResult(g.hpipe,&g.overlap,&bytes,FALSE)) { //4番目のパラメータをTRUEにすると完了を待つ
// -- 読込み完了
}
else {
if (GetLastError() != ERROR_IO_INCOMPLETE) {
// -- エラー
}
}
switch (WaitForSingleObject(g.hEvent,1000)) { // -- タイムアウト1秒に設定
case WAIT_OBJECT_0: // -- 完了
break;
case WAIT_TIMEOUT: // -- タイムアウト
break;
default: // -- エラー
}
値 | 意味 |
---|---|
WAIT_OBJECT_0 | シグナル状態になった(処理が完了した) |
WAIT_TIMEOUT | タイムアウトで戻ってきた |
WAIT_ABANDONED | オブジェクトが別スレッドで廃棄された |
WAIT_FAILED | 関数が失敗した |
BOOL SetEvent(HANDLE hHandle);
BOOL ResetEvent(HANDLE hHandle);