日時指定コントロールを表示する

日時指定コントロールです。

resource.h

#define IDR_MENU1  100
#define IDM_END 101
#define IDM_INPUT 102
#define ID_STATUS 103

menu.rc

#include <windows.h>
#include "resource.h"

IDR_MENU1 MENU DISCARDABLE
BEGIN
    POPUP "ファイル"
    BEGIN
        MENUITEM "終了",                    IDM_END
    END
    MENUITEM "入力",                    IDM_INPUT
END

DLG1 DIALOG DISCARDABLE  0, 0, 170, 50
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "日付・時刻入力"
FONT 9, "MS Pゴシック"
BEGIN
    DEFPUSHBUTTON   "OK",IDOK,7,30,50,14
    PUSHBUTTON      "キャンセル",IDCANCEL,102,30,50,14
END

main.cpp

#pragma comment(linker, "/SUBSYSTEM:WINDOWS /ENTRY:mainCRTStartup")
#pragma comment(lib, "comctl32.lib")
#include <windows.h>
#include <GL/freeglut/freeglut.h>
#include "resource.h"
#include <commctrl.h> //CreateStatusWindow()のために必要
#include <richedit.h>

//FreeGlutのウインドウプロシージャを置き換える為の変数
WNDPROC WndProc=NULL; //元のウィンドウプロシージャ
HWND hWnd2=NULL; //ウィンドウハンドル
HMENU hMenu=NULL; //メニュー
HWND hStatusbar;     // ステータスバーのハンドル

wchar_t szTime[256] = L"";
wchar_t szDate[256] = L"";

#define WIDTH 320
#define HEIGHT 240
 
//回転用
float anglex = 0.0f;
//白
GLfloat white[] = { 1.0, 1.0, 1.0, 1.0 };
 
HWND MakeTimeCtl(HWND hWnd){
    HWND hTime;
    LPWSTR lpstrTime = L"tthh'時'mm'分'ss'秒'";

    hTime = CreateWindowEx(0,
        DATETIMEPICK_CLASS, NULL, WS_BORDER | WS_VISIBLE | WS_CHILD | DTS_TIMEFORMAT,
        160, 10, 120, 25, hWnd, NULL, (HINSTANCE)GetWindowLong(hWnd2, GWL_HINSTANCE), NULL);
    SendMessage(hTime, DTM_SETFORMAT, 0, (LPARAM)lpstrTime);
    return hTime;
}

HWND MakeDateCtl(HWND hWnd){
    HWND hDate;
    LPWSTR lpstrDate = L"yyy'年'MM'月'dd'日'dddd";

    hDate = CreateWindowEx(0,
        DATETIMEPICK_CLASS, NULL, WS_BORDER | WS_VISIBLE | WS_CHILD | DTS_LONGDATEFORMAT,
        10, 10, 150, 25, hWnd, NULL, (HINSTANCE)GetWindowLong(hWnd2, GWL_HINSTANCE), NULL);
    SendMessage(hDate, DTM_SETFORMAT, 0, (LPARAM)lpstrDate);
    return hDate;
}
LRESULT CALLBACK DlgProc(HWND hDlg, UINT msg, WPARAM wp, LPARAM lp){
    static HWND hDate, hTime, hParent;

    switch (msg) {
        case WM_COMMAND:
            switch (LOWORD(wp)) {
                case IDOK:
                    GetWindowText(hTime, szTime, sizeof(szTime));
                    GetWindowText(hDate, szDate, sizeof(szDate));
                    InvalidateRect(hParent, NULL, TRUE);
                    EndDialog(hDlg, IDOK);
                    return TRUE;
                case IDCANCEL:
                    EndDialog(hDlg, IDCANCEL);
                    return TRUE;
            }
            break;
        case WM_INITDIALOG:
            hDate = MakeDateCtl(hDlg);
            hTime = MakeTimeCtl(hDlg);
            hParent = GetParent(hDlg);
            return TRUE;
    }
    return FALSE;
}

//置き換えた後のプロシージャ
LRESULT CALLBACK WndProc2(HWND hWnd , UINT msg , WPARAM wParam , LPARAM lParam){
 switch( msg ){
  case WM_SIZE:
   SendMessage( hStatusbar, WM_SIZE, wParam, lParam );
   return 0;
  case WM_COMMAND:
   switch (LOWORD(wParam)){
     case IDM_END:
        SendMessage(hWnd, WM_CLOSE, 0, 0);
        break;
     case IDM_INPUT:
        DialogBox((HINSTANCE)GetWindowLong(hWnd2, GWL_HINSTANCE), L"DLG1", hWnd, (DLGPROC)DlgProc);
        break;
   }
   return 0;
  case WM_DESTROY:
   exit(0);
   break;
  default:
   if(WndProc){
    return CallWindowProc(WndProc,hWnd , msg , wParam , lParam);
   }else{
    return DefWindowProc(hWnd,msg,wParam,lParam);
  }
 }
}
 
//ウィンドウの検索
BOOL CALLBACK enumWindowsProc(HWND hWnd,LPARAM lParam){
 HANDLE hModule=(HANDLE)GetWindowLong(hWnd,GWL_HINSTANCE);
 if(GetModuleHandle(NULL)==hModule){
  wchar_t ClassName[256];
  GetClassNameW(hWnd,ClassName,sizeof(ClassName)/sizeof(ClassName[0]));
  if(wcsncmp(ClassName,L"FREEGLUT",wcslen(ClassName))==0){
   hWnd2=hWnd;
   return FALSE;
  }
 }
 return TRUE;
}
 
void display(void){
 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
 glViewport(0, 0, WIDTH, HEIGHT);
 glMatrixMode(GL_PROJECTION);
 glLoadIdentity();
 
 gluPerspective(30.0, (double)WIDTH / (double)HEIGHT, 1.0, 1000.0);
 glMatrixMode(GL_MODELVIEW);
 glLoadIdentity();
 
 gluLookAt(150.0,150.0,-150.0,
       0.0,0.0,0.0,
      0.0,1.0,0.0);
 
 glMaterialfv(GL_FRONT, GL_DIFFUSE, white);
 //回転
 glRotatef(anglex,1.0f,0.0f,0.0f);//X軸を回転
 glutSolidSphere(40.0,16,16);
 
 glutSwapBuffers();
}
void idle(void){
 anglex+=2.0f;
 Sleep(1);
 glutPostRedisplay();
}
void Init(){
 glClearColor(0.3f, 0.3f, 0.3f, 1.0f);
 glEnable(GL_DEPTH_TEST);
 //ワイヤーフレーム
 glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);
}
bool main(int argc, char *argv[]){
 glutInitWindowPosition(100, 100);
 glutInitWindowSize(WIDTH, HEIGHT);
 glutInit(&argc, argv);
 glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE);
 glutCreateWindow("日時指定コントロール");
 //FreeGlutのウインドウハンドルとウインドウプロシージャを置き換える
 EnumWindows(enumWindowsProc,0);
 if(hWnd2){
  WndProc=(WNDPROC)GetWindowLong(hWnd2,GWL_WNDPROC);
  SetWindowLong(hWnd2,GWL_WNDPROC,(LONG)WndProc2);
 }else{
  return false;
 }
 //メニューを作成
 hMenu=LoadMenu(GetModuleHandle(NULL),MAKEINTRESOURCE(IDR_MENU1));
 if(hMenu){
  SetMenu(hWnd2,hMenu);
 }else{
  return false;
 }
 // コモンコントロール関係の初期化
 InitCommonControls();
 // ステータスバーを作成
 hStatusbar = CreateStatusWindowW(WS_CHILD | WS_VISIBLE | CCS_BOTTOM | SBARS_SIZEGRIP,
   L"メニューの入力で入力用ダイアログ表示",hWnd2,ID_STATUS);

 glutDisplayFunc(display);
 glutIdleFunc(idle);
 Init();
 glutMainLoop();
 return 0;
}

 

 

 

 

 

最終更新:2014年06月14日 14:54
添付ファイル