先日, 提供先でもコンパイルできるコードを作らなくてはならないことがありました. 先方の環境は Visual C++ のExpress Edition のため, 普段私が使う MFC は使えません. 一方で私が普段作るプログラムはシンプルなダイアログベースばかりです. というわけで, MFC 抜きでダイアログベースのプログラムをどのように作ればいいのか調べましたので, 忘れないよう書いておきます.
#pragma once #include "targetver.h" #define WIN32_LEAN_AND_MEAN #define _CRT_SECURE_NO_DEPRECATE #include <windows.h> #include <stdio.h> |
#pragma once #ifndef WINVER #define WINVER 0x0501 #endif #ifndef _WIN32_WINNT #define _WIN32_WINNT 0x0501 #endif #ifndef _WIN32_WINDOWS #define _WIN32_WINDOWS 0x0410 #endif #ifndef _WIN32_IE #define _WIN32_IE 0x0700 #endif |
#include "stdafx.h" #include "MainDlg.h" #include "messageIDs.h" CMainDlg g_MainDlg; LRESULT CALLBACK MainDlgProc(HWND, UINT, WPARAM, LPARAM); int WINAPI WinMain(HINSTANCE hCurInst, HINSTANCE hPrevInst, LPSTR lpsCmdLine, int nCmdShow) { g_MainDlg.m_pCmdLine=lpsCmdLine; DialogBox(hCurInst, "SAMPLEDLG", NULL, (DLGPROC)MainDlgProc); return 0; } LRESULT CALLBACK MainDlgProc(HWND hDlgWnd, UINT msg, WPARAM wp, LPARAM lp){ switch(msg){ case WM_INITDIALOG: { HWND hDeskWnd=GetDesktopWindow(); RECT deskrc, rc; GetWindowRect(hDeskWnd, (LPRECT)&deskrc); GetWindowRect(hDlgWnd, (LPRECT)&rc); int x = (deskrc.right - (rc.right-rc.left)) / 2; int y = (deskrc.bottom - (rc.bottom-rc.top)) / 2; SetWindowPos(hDlgWnd, HWND_TOP, x, y, (rc.right-rc.left), (rc.bottom-rc.top),SWP_SHOWWINDOW); g_MainDlg.m_hWnd=hDlgWnd; return g_MainDlg.InitDlg(hDlgWnd); } case WM_CLOSE: if (g_MainDlg.DestoryWnd(hDlgWnd)){ DestroyWindow(hDlgWnd); return TRUE; } return FALSE; } return g_MainDlg.Proc(msg, wp, lp); } |
#ifndef _MAIN_DLG_H_ #define _MAIN_DLG_H_ class CMainDlg{ public: char *m_pCmdLine; HWND m_hWnd; CMainDlg(); ~CMainDlg(); BOOL InitDlg(HWND); BOOL DestoryWnd(HWND); LRESULT Proc(UINT, WPARAM, LPARAM); }; #endif |
#include "stdafx.h" #include "messageIDs.h" #include "MainDlg.h" CMainDlg::CMainDlg(){ m_hWnd=NULL; } CMainDlg::~CMainDlg(){ } LRESULT CMainDlg::Proc(UINT msg, WPARAM wp, LPARAM lp){ switch (msg) { case WM_COMMAND: return FALSE; case WM_CLOSE: return TRUE; } return FALSE; } BOOL CMainDlg::InitDlg(HWND hWnd){ return TRUE; } BOOL CMainDlg::DestoryWnd(HWND){ return TRUE; } |
#pragma once #define IDC_STATIC 3000 #define IDC_STATUS 4000 #define ID_START 4001 |
#include "windows.h" #include "messageIDs.h" SAMPLEDLG DIALOG DISCARDABLE 0, 0, 110, 78 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "SampleDlg" FONT 9, "MS Pゴシック" BEGIN LTEXT "Text Line",IDC_STATIC,8,5,94,8 EDITTEXT IDC_STATUS,8,18,94,36,ES_MULTILINE | ES_AUTOVSCROLL | ES_AUTOHSCROLL | ES_WANTRETURN DEFPUSHBUTTON "Button",ID_START,55,59,50,14 END |
でもこれはただ, 画面が立ち上がっただけです. 何もしません. というわけで, 少し反応するようにしてみます.
SetWindowText(GetDlgItem(hWnd, IDC_STATIC), "New Line Test"); UpdateWindow(hWnd); |
switch (LOWORD(wp)) { case ID_START: OnButtonPushed(); return TRUE; } |
void CMainDlg::OnButtonPushed(){ static int n=3; char buf[25]; sprintf(buf, "%04d\r\n%04d\r\n%04d\r\n%04d\r\n",n,n-1,n-2,n-3,n-4); if (++n > 9999) n=3; SetWindowText(GetDlgItem(m_hWnd, IDC_STATUS), buf); UpdateWindow(m_hWnd); } |