#pragma comment(linker, "/SUBSYSTEM:WINDOWS /ENTRY:mainCRTStartup")
#pragma comment(lib, "comctl32.lib")
#include <GL/freeglut/freeglut.h>
#include "resource.h"
#include <commctrl.h> //CreateStatusWindow()のために必要
//FreeGlutのウインドウプロシージャを置き換える為の変数
WNDPROC WndProc=NULL; //元のウィンドウプロシージャ
HWND hWnd2=NULL; //ウィンドウハンドル
HMENU hMenu=NULL; //メニュー
HWND hStatusbar; // ステータスバーのハンドル
HWND hToolbar; //ツールバーのハンドル
TBBUTTON tbb[] = {
{STD_FILENEW, IDM_NEW, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0},
{STD_FILEOPEN, IDM_OPEN, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0},
{STD_FILESAVE, IDM_SAVE, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0},
{STD_COPY, IDM_COPY, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0},
{STD_CUT, IDM_CUT, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0},
{STD_DELETE, IDM_DELETE, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0},
{STD_FIND, IDM_FIND, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0},
{STD_HELP, IDM_HELP, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0},
{STD_PASTE, IDM_PASTE, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0},
{STD_PRINT, IDM_PRINT, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0},
{STD_REDOW, IDM_REDOW, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0},
{STD_REPLACE, IDM_REPLACE, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0},
{VIEW_DETAILS, IDM_DETAILS, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0}
};
#define WIDTH 320
#define HEIGHT 240
//回転用
float anglex = 0.0f;
//白
GLfloat white[] = { 1.0, 1.0, 1.0, 1.0 };
//置き換えた後のプロシージャ
LRESULT CALLBACK WndProc2(HWND hWnd , UINT msg , WPARAM wParam , LPARAM
lParam){
switch( msg ){
case WM_SIZE:
SendMessage( hStatusbar, WM_SIZE, wParam, lParam );
SendMessage(hToolbar , msg , wParam , lParam);
return 0;
case WM_COMMAND:
switch (LOWORD(wParam)){
case ID_EXIT:
PostQuitMessage(0);
}
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);
}
HWND CreateToolWnd(HWND hWnd){
HWND hTool, hToolTip;
static TBADDBITMAP tbab;
static TOOLINFO ti;
static int stdid, id;
// ツールバーを作る
hTool = CreateToolbarEx(
hWnd,
WS_CHILD | WS_VISIBLE,
ID_TOOLBAR,
12,
(HINSTANCE)HINST_COMMCTRL,
IDB_STD_SMALL_COLOR,
(LPCTBBUTTON)tbb,
12,
0, 0,
0, 0,
sizeof(TBBUTTON));
tbab.hInst = HINST_COMMCTRL;
tbab.nID = IDB_VIEW_SMALL_COLOR;
stdid = SendMessage(hTool, TB_ADDBITMAP, 1, (LPARAM)&tbab);
for (id = 12; id <= 12; id++) {
tbb[id].iBitmap += stdid;
}
SendMessage(hTool, TB_ADDBUTTONS, 1, (LPARAM)&tbb[12]);
SendMessage(hTool, TB_AUTOSIZE, 0, 0);
// ツールチップを作る
hToolTip = CreateWindowEx(
0, //拡張ウィンドウスタイル
TOOLTIPS_CLASS, //クラスネーム
NULL, //ウィンドウネーム
TTS_ALWAYSTIP, // ウィンドウスタイル
CW_USEDEFAULT, // X座標
CW_USEDEFAULT, // Y座標
CW_USEDEFAULT, // 幅
CW_USEDEFAULT, // 高さ
hWnd, // 親ウィンドウのハンドル
NULL, // メニューハンドル
(HINSTANCE)GetWindowLong(hWnd, GWL_HINSTANCE), // インスタンスハンドル
NULL); // WM_CREATEデータ
ti.cbSize = TTTOOLINFOW_V1_SIZE;
ti.hwnd = hTool;
ti.hinst = (HINSTANCE)GetWindowLong(hWnd, GWL_HINSTANCE);
ti.uFlags = TTF_SUBCLASS;
for (id = 0; id <= 12; id++) {
SendMessage(hTool, TB_GETITEMRECT, id, (LPARAM)&ti.rect);
ti.uId = tbb[id].idCommand;
ti.lpszText = (LPTSTR)tbb[id].idCommand;
SendMessage(hToolTip, TTM_ADDTOOL, 0, (LPARAM)&ti);
}
SendMessage(hTool, TB_SETTOOLTIPS, (WPARAM)hToolTip, 0);
return hTool;
}
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);
TBBUTTON tbutton[] = {
{STD_FILENEW, IDM_NEW, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0},
{STD_FILEOPEN, IDM_OPEN, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0},
{STD_FILESAVE, IDM_SAVE, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0},
{0, 0, TBSTATE_ENABLED, TBSTYLE_SEP, 0, 0},
{STD_COPY, IDM_COPY, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0},
{STD_PASTE, IDM_PASTE, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0},
{STD_DELETE, IDM_DELETE, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0},
{STD_CUT, IDM_CUT, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0}
};
hToolbar = CreateToolWnd(hWnd2);
glutDisplayFunc(display);
glutIdleFunc(idle);
Init();
glutMainLoop();
return true;
}
|