スクロールバーを表示する

スクロールバーコントロールです。
ウインドウのスクロールバーと違って任意の位置に表示できます。

 

resource.h

#define IDR_MENU1 100
#define ID_EXIT   101
#define ID_SCROLL  104
#define ID_Help   110
#define ID_STATUS 111
#define IDM_END   114
#define ID_OPTION 115

menu.rc

#include "windows.h"
#include "resource.h"

IDR_MENU1 MENU
BEGIN
    POPUP "File"
    BEGIN
        MENUITEM "Exit",                    ID_EXIT
    END
    MENUITEM "Option"      ID_OPTION
 MENUITEM "ヘルプ",      ID_Help
END

main.cpp

#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;     // ステータスバーのハンドル
HINSTANCE hInstance;    //インスタンスハンドル


#define WIDTH 320
#define HEIGHT 240

//回転用
float anglex = 0.0f;
//白
GLfloat white[] = { 1.0, 1.0, 1.0, 1.0 };

static LRESULT ScrollProc(HWND hwnd,int nScrollCode,short nPos,HWND hwndScrollBar){
    static int gPos=5;
           int gMin;
           int gMax;
    if(hwndScrollBar!=NULL)
    {
        GetScrollRange(hwndScrollBar,SB_CTL,&gMin,&gMax);
        switch(nScrollCode)
        {
            case    SB_LINEDOWN:
                gPos=GetScrollPos(hwndScrollBar,SB_CTL);
                gPos+=1;
                if(gPos>gMax)
                    gPos=gMax;
                break;
            case    SB_LINEUP:
                gPos=GetScrollPos(hwndScrollBar,SB_CTL);
                gPos-=1;
                if(gPos<gMin)
                    gPos=gMin;
                break;
            case    SB_PAGEUP:
                gPos=GetScrollPos(hwndScrollBar,SB_CTL);
                gPos-=2;
                if(gPos<gMin)
                    gPos=gMin;
                break;
            case    SB_PAGEDOWN:
                gPos=GetScrollPos(hwndScrollBar,SB_CTL);
                gPos+=2;
                if(gPos>gMax)
                    gPos=gMax;
                break;
            case    SB_THUMBPOSITION:
                gPos=nPos;
                break;
        }
        SetScrollPos(hwndScrollBar,SB_CTL,gPos,TRUE);
    }
    return  0;
}

 //置き換えた後のプロシージャ
LRESULT CALLBACK WndProc2(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp){
    static RECT rcDisp;

    switch (msg) {
        case WM_CREATE:
            // コモンコントロールの初期化
            InitCommonControls();
            break;
        case WM_COMMAND:
            switch(LOWORD(wp)) {
                case ID_EXIT:
                    PostQuitMessage(0);
                    break;
            }
            break;
        case WM_SIZE:
            GetClientRect(hWnd, &rcDisp);
            SendMessage( hStatusbar, WM_SIZE, wp, lp );
            break;
        case WM_DESTROY:
            exit(0);
            break;
        case    WM_VSCROLL:
            return ScrollProc(hWnd,LOWORD(wp),HIWORD(wp),(HWND)lp);
            break;
        default:
     if(WndProc){
      return CallWindowProc(WndProc,hWnd , msg , wp , lp);
     }else{
      return DefWindowProc(hWnd,msg,wp,lp);
     }
    }
    return 0;
}

//ウィンドウの検索
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;
 }
 // ステータスバーを作成
 hStatusbar = CreateStatusWindowW(WS_CHILD | WS_VISIBLE | CCS_BOTTOM | SBARS_SIZEGRIP,
   L"ステータスバー",hWnd2,ID_STATUS);

 HINSTANCE hInst = (HINSTANCE)GetWindowLong(hWnd2, GWL_HINSTANCE);
 HWND hScroll = CreateWindow(L"SCROLLBAR",L"",WS_CHILD|WS_VISIBLE|SBS_VERT,
                 10,10,40,150,hWnd2,(HMENU)ID_SCROLL,hInst,NULL);
 SetScrollRange(GetDlgItem(hWnd2,ID_SCROLL),SB_CTL,0,10,TRUE);
 SetScrollPos(GetDlgItem(hWnd2,ID_SCROLL),SB_CTL,5,TRUE);
 glutDisplayFunc(display);
 glutIdleFunc(idle);
 Init();
 glutMainLoop();
 return 0;
}

 

 

 

 

 

最終更新:2014年06月12日 20:36
添付ファイル