2013年6月5日水曜日

ウインドウにメニューをつける

ウインドウの作成:win32 の記事のプロジェクト・ソースを変更する


ヘッダファイルを作成する resource.h
#define IDM_MAKE 100
#define IDM_OPEN 101
#define IDM_ABOUT 104
#define IDM_EXIT 105
#define IDC_WIN32SANPLE 109
  
最後の行は改行しないとエラーが出る。

Visual C++ 2010 Express ではリソースファイルを作れないので、
コピーして持ってくるかテキストエディッターで作って読み込む。

読み込んだファイルを開いてソースコードを書き込んで保存する。 test.rc
#include "resource.h"

/////////////////////////////////////////////////////////////////////////////
//
// メニュー
//

IDC_WIN32SANPLE MENU
BEGIN
    POPUP "ファイル(&F)"
    BEGIN
    MENUITEM "新規作成(&N)" , IDM_MAKE
    MENUITEM "開く(&O)" , IDM_OPEN
    MENUITEM "アプリケーションの終了(&X)", IDM_EXIT
    END
    POPUP "ヘルプ(&H)"
    BEGIN
    MENUITEM "バージョン情報(&A)...", IDM_ABOUT
    END
END

// GT_HelloWorldWin32.cpp
// compile with: /D_UNICODE /DUNICODE /DWIN32 /D_WINDOWS /c

#include <windows.h>
#include <stdlib.h>
#include <string.h>
#include <tchar.h>
#include "resource.h"

// Global variables

// The main window class name.
static TCHAR szWindowClass[] = _T("win32app");

// The string that appears in the application's title bar.
static TCHAR szTitle[] = _T("Win32 Guided Tour Application");

HINSTANCE hInst;

// Forward declarations of functions included in this code module:
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

int WINAPI WinMain(HINSTANCE hInstance,
 HINSTANCE hPrevInstance,
 LPSTR lpCmdLine,
 int nCmdShow)
{
 WNDCLASSEX wcex;

 wcex.cbSize = sizeof(WNDCLASSEX);
 wcex.style          = CS_HREDRAW | CS_VREDRAW;
 wcex.lpfnWndProc    = WndProc;
 wcex.cbClsExtra     = 0;
 wcex.cbWndExtra     = 0;
 wcex.hInstance      = hInstance;
 wcex.hIcon          = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_APPLICATION));
 wcex.hCursor        = LoadCursor(NULL, IDC_ARROW);
 wcex.hbrBackground  = (HBRUSH)(COLOR_WINDOW+1);
 wcex.lpszMenuName   = MAKEINTRESOURCE(IDC_WIN32SANPLE);
 wcex.lpszClassName  = szWindowClass;
 wcex.hIconSm        = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_APPLICATION));

 if (!RegisterClassEx(&wcex))
 {
  MessageBox(NULL,
   _T("Call to RegisterClassEx failed!"),
   _T("Win32 Guided Tour"),
   NULL);

  return 1;
 }

 hInst = hInstance; // Store instance handle in our global variable

 // The parameters to CreateWindow explained:
 // szWindowClass: the name of the application
 // szTitle: the text that appears in the title bar
 // WS_OVERLAPPEDWINDOW: the type of window to create
 // CW_USEDEFAULT, CW_USEDEFAULT: initial position (x, y)
 // 500, 100: initial size (width, length)
 // NULL: the parent of this window
 // NULL: this application does not have a menu bar
 // hInstance: the first parameter from WinMain
 // NULL: not used in this application
 HWND hWnd = CreateWindow(
  szWindowClass,
  szTitle,
  WS_OVERLAPPEDWINDOW,
  CW_USEDEFAULT, CW_USEDEFAULT,
  500, 100,
  NULL,
  NULL,
  hInstance,
  NULL
  );

 if (!hWnd)
 {
  MessageBox(NULL,
   _T("Call to CreateWindow failed!"),
   _T("Win32 Guided Tour"),
   NULL);

  return 1;
 }

 // The parameters to ShowWindow explained:
 // hWnd: the value returned from CreateWindow
 // nCmdShow: the fourth parameter from WinMain
 ShowWindow(hWnd,
  nCmdShow);
 UpdateWindow(hWnd);

 // Main message loop:
 MSG msg;
 while (GetMessage(&msg, NULL, 0, 0))
 {
  TranslateMessage(&msg);
  DispatchMessage(&msg);
 }

 return (int) msg.wParam;
}

//
//  FUNCTION: WndProc(HWND, UINT, WPARAM, LPARAM)
//
//  PURPOSE:  Processes messages for the main window.
//
//  WM_PAINT    - Paint the main window
//  WM_DESTROY  - post a quit message and return
//
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
 PAINTSTRUCT ps;
 HDC hdc;
 TCHAR greeting[] = _T("Hello, World!");
 static HMENU hMenu;
 int wmId, wmEvent;
 

 switch (message)
 {
 case WM_COMMAND:
  wmId = LOWORD(wParam);
  wmEvent = HIWORD(wParam);
  // 選択したメニューの処理
  switch (wmId)
  {
  case IDM_MAKE:
   MessageBox(NULL,TEXT("新規作成が選択された"),
    TEXT("タイトル"),
    NULL);
   break;
  case IDM_OPEN:
   MessageBox(NULL,TEXT("開くが選択された"),
    TEXT("タイトル"),
    NULL);
   break;
  case IDM_EXIT://プログラムの終了
   DestroyWindow(hWnd);
   break;
  default:
   return DefWindowProc(hWnd, message, wParam, lParam);
  }
  break;

 case WM_PAINT:
  hdc = BeginPaint(hWnd, &ps);

  // Here your application is laid out.
  // For this introduction, we just print out "Hello, World!"
  // in the top left corner.
  TextOut(hdc,
   5, 5,
   greeting, _tcslen(greeting));
  // End application-specific layout section.

  EndPaint(hWnd, &ps);
  break;
 case WM_DESTROY:
  PostQuitMessage(0);
  break;
 default:
  return DefWindowProc(hWnd, message, wParam, lParam);
  break;
 }

 return 0;
}

0 件のコメント:

コメントを投稿