Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.11.2012, 20:37   #1
PinkPink
Пользователь
 
Регистрация: 09.10.2011
Сообщений: 98
По умолчанию 2 скроллбара

Как создать 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;
}
В итоге один скроллбар выводится в нормальном виде, другой просто как серая полоса
PinkPink вне форума Ответить с цитированием
Старый 01.11.2012, 21:55   #2
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Зачем мучаться так?
Существует готовый, системный класс окна (на подобие BUTTON и EDIT) и он называется SCROLLBAR...

CreateWindow("SCROLLBAR",...)
A дальше смотрим SBM_ сообщения
waleri вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск