Как создать 2 горизонтальных скроллбара? И как потом получать события и различать от какого из скроллбаров пришло событие?
Код:
#include <stdio.h>
#include <windows.h>
#include <stdlib.h>
#include <string.h>
#include <tchar.h>
static TCHAR szClass[] = _T("win32app");
static TCHAR szTitle[] = _T("Работа с цветом");
static TCHAR ca[] = _T("scrollbar");
static TCHAR cb[] = _T("static");
static TCHAR cc[] = _T("scrollbar");
static TCHAR cd[] = _T("static");
#define CM_GET_COLOR 1003
#define CM_FILE_QUIT 1001
HINSTANCE hInst;
static HWND hEdit;
BOOL RC(WNDPROC, LPCTSTR, UINT);
int a=0;
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);//функция оконной процедуры
BOOL RC(WNDPROC WndProc, LPCTSTR Name, UINT brBackground)
{
WNDCLASS wc = { 0 };
wc.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS;
wc.lpfnWndProc=WndProc; //указывает на функцию окна
wc.hInstance=hInst; //указывает на дескриптор текущего приложения
wc.hIcon=LoadIcon(hInst,MAKEINTRESOURCE(IDI_APPLICATION)); //иконка
wc.hCursor=LoadCursor(NULL, IDC_ARROW); //курсор
wc.hbrBackground=(HBRUSH)( brBackground +1); // задает дескриптор кисти закрашивания фона окна
wc.lpszMenuName=NULL; // имя
wc.lpszClassName=Name; //имя класса окон
return (RegisterClass(&wc)!=0);
}
int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow) ///главная функция
{
hInst=hInstance;
if(!RC(WndProc,szClass,COLOR_WINDOW)) return FALSE;
//создаём окно
HWND hwnd = CreateWindow(
szClass,
szTitle,
WS_OVERLAPPEDWINDOW|WS_VISIBLE,
CW_USEDEFAULT, CW_USEDEFAULT,
500, 500,
NULL,
(HMENU)NULL,
hInstance,
NULL
);
if (!hwnd)
{
MessageBox(NULL,
_T("Call to CreateWindow failed!"),
_T("Win32 Guided Tour"),
NULL);
return FALSE;
}
//отображаем окно
ShowWindow(hwnd,
nCmdShow);
UpdateWindow(hwnd);
//цикл обработки сообщений отправляемых ОС
MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return (int) msg.wParam;
}
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)//добавляем функциональные возможности
{
PAINTSTRUCT ps;
HDC hDC;
SIZE size;
char *str ="Пробный вывод";
HFONT hNFont, hOFont;
TCHAR greeting[] = _T("");
static HWND hxScroll,hyScroll;
static int nxPos,nxMin,nxMax,nyPos,nyMin,nyMax;
switch (message)
{
case WM_PAINT:
static LOGFONT lf;
hDC = BeginPaint(hwnd, &ps);
SetBkMode(hDC, TRANSPARENT);
lf.lfCharSet=DEFAULT_CHARSET;
lf.lfPitchAndFamily=DEFAULT_PITCH;
lf.lfHeight=20;
lf.lfWeight=FW_BOLD;
GetTextExtentPoint32A(hDC, str, strlen(str), &size);
hNFont=CreateFontIndirect(&lf);
hOFont=(HFONT)SelectObject(hDC,hNFont);
SetTextColor(hDC, RGB(0,0,0));
TextOutA(hDC, 250, 50, str, size.cx);
SelectObject(hDC,hOFont);
DeleteObject(hNFont);
EndPaint(hwnd, &ps);
break;
case WM_CREATE:
hxScroll=CreateWindow(ca,NULL,WS_CHILD|WS_VISIBLE|SBS_HORZ,20,60,200,25,hwnd,(HMENU)-1,hInst,NULL);
nxPos=100;nxMin=1;nxMax=200;
SetScrollRange(hxScroll,SB_CTL,nxMin,nxMax,TRUE);
SetScrollPos(hxScroll,SB_CTL,nxPos,TRUE);
hyScroll=CreateWindow(cd,NULL,WS_CHILD|WS_VISIBLE|SBS_HORZ,20,120,200,25,hwnd,(HMENU)-1,hInst,NULL);
nyPos=200;nyMin=1;nyMax=200;
SetScrollRange(hyScroll,SB_CTL,nyMin,nyMax,TRUE);
SetScrollPos(hyScroll,SB_CTL,nyPos,TRUE);
return 0;
break;
case WM_HSCROLL:
{
switch(LOWORD(wParam))
{
case SB_PAGERIGHT:
{nxPos+=10;break;}
case SB_LINERIGHT:
{nxPos+=1;break;}
case SB_PAGELEFT:
{nxPos-=10;break;}
case SB_LINELEFT:
{nxPos-=1;break;}
case SB_TOP:
{nxPos=nxMin;break;}
case SB_BOTTOM:
{nxPos=nxMax;break;}
case SB_THUMBPOSITION:
case SB_THUMBTRACK:
{nxPos=HIWORD(wParam);break;}
default:break;
}
if(nxPos>nxMax)nxPos=nxMax;
if(nxPos<nxMin)nxPos=nxMin;
SetScrollPos(hxScroll,SB_CTL,nxPos,TRUE);
if(nxPos==nxMax) EnableScrollBar(hxScroll,SB_CTL,ESB_DISABLE_RIGHT);
return 0;
}
case WM_DESTROY:
{
PostQuitMessage(0);
return 0;
}
default:return DefWindowProc(hwnd, message, wParam, lParam);break;
}
return 0;
}
В итоге один скроллбар выводится в нормальном виде, другой просто как серая полоса