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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 15.11.2009, 15:28   #1
meight
 
Регистрация: 15.11.2009
Сообщений: 6
Вопрос Окно со скролингом

Доброе время суток. не могу запустить программу, не пойму где ошибаюсь. Программа должна создавать окно и полосы прокрутки которые должны реагировать на нажатия клавиш клавиатуры.
текст программы:
#include <windows.h>

BOOL RegisterClass(WNDPROC, LPCTSTR, UINT);
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
HINSTANCE hInstance;
char szClassName[] = "ScrollCIass";
char szTitle[] = "okno + scroll";
int WINAPI WinMain(HINSTANCE hInst,
HINSTANCE hPrevinstance,
LPSTR lpszCmdLine,
int nCmdShow)
{ MSG msg; HWND hwnd; hInstance=hInst;
if(!RegClass(WndProc, szClassName, COLOR_WINDOW))
return FALSE;
if(!(hwnd=CreateWindow(szClassName, szTitle,
WS_OVERLAPPEDWINDOW | WS_VSCROLL | WS_VISIBLE,
194, 50, 246, 350, 0, 0, hInstance, NULL))) return FALSE;
while (GetMessage(&msg, 0, 0, 0)) DispatchMessage(&msg);
return msg.wParam;
}
BOOL RegClass(WNDPROC Proc, LPCTSTR szName, UINT brBackground)
{ WNDCLASS wc; wc.style=wc.cbClsExtra=wc.cbWndExtr a=0;
wc.lpfnWndProc=Proc; wc.hInstance = hInstance;
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH)(brBackground + 1);
wc.lpszMenuName = (LPCTSTR)NULL;
wc.lpszClassName=szName; return (RegisterClass(&wc) !=0);
}
LRESULT CALLBACK WndProc (HWND hwnd, UINT msg,
WPARAM wParam, LPARAM lParam )
{ static unsigned int nyPos, nyMin, nyMax, nyPage;
static SCROLLINFO siy;
switch (msg)
{ case WM_CREATE:
{ nyPos=nyMin=1; nyMax=200; nyPage=10;
siy.cbSize=sizeof(siy); siy.fMask=SIF_ALL;
siy.nMin=nyMin; siy.nMax=nyMax;
siy.nPage=nyPage; siy.nPos=nyPos;
SetScrollInfo(hwnd, SB_VERT, &siy, TRUE);
return 0;
}
case WM_VSCROLL:
{ switch (LOWORD(wParam))
{ case SB_PAGERIGHT:
{ nyPos +=10; break;}
case SB_LINERIGHT:
{ nyPos+=1; siy.nPage+=1; break;}
case SB_PAGELEFT:
{ nyPos-=10; break;}
case SB_LINELEFT:
{ nyPos-=1; siy.nPage-=1; break;}
case SB_TOP:
{ nyPos=nyMin; break;}
case SB_BOTTOM:
{ nyPos=nyMax; break;}
case SB_THUMBPOSITION:
case SB_THUMBTRACK:
{ nyPos=HIWORD(wParam); break;}
}
if (nyPos>nyMax) nyPos=nyMax;
if (nyPos<nyMin) nyPos=nyMin;
siy.nPos=nyPos; siy.fMask=SIF_POS | SIF_PAGE;
if (siy.nPage<nyPage || siy.nPage>nyMax)
siy.nPage=nyPage;
SetScrollInfo(hwnd, SB_VERT, &siy, TRUE);
return 0;
}
case WM_KEYDOWN:
{ switch (wParam)
{ case VK_HOME:
if (HIBYTE(GetKeyState(VK_CONTROL)))
SendMessage(hwnd,WM_VSCROLL, SB_TOP, 0L);
break;
case VK_END:
if (HIBYTE(GetKeyState(VK_CONTROL)))
SendMessage(hwnd,WM_VSCROLL, SB_BOTTOM, 0L);
break;
case VK_UP:
SendMessage(hwnd, WM_VSCROLL, SB_LINELEFT, 0L);
break;
case VK_DOWN:
SendMessage(hwnd, WM_VSCROLL, SB_LINERIGHT, 0L);
break;
case VK_PRIOR:
SendMessage(hwnd, WM_VSCROLL, SB_PAGELEFT, 0L);
break;
case VK_NEXT:
SendMessage(hwnd, WM_VSCROLL, SB_PAGERIGHT, 0L);
break;
}
return 0;
case WM_DESTROY:{PostQuitMessage(0); return 0;}
}
return DefWindowProc(hwnd, msg, wParam, lParam);
}
}

ПОМОГИТЕ РАЗОБРАТСЯ. ПОЖАЛУСТА.
meight вне форума Ответить с цитированием
Старый 15.11.2009, 19:18   #2
counter
Участник клуба
 
Регистрация: 18.10.2008
Сообщений: 1,409
По умолчанию

вот так работает

Код:
LRESULT CALLBACK WndProc (HWND hwnd, UINT msg,WPARAM wParam, LPARAM lParam )
{ 
	static int nyPos, nyMin, nyMax, nyPage;
	static SCROLLINFO siy;
	
	switch (msg)
	{ 
	case WM_CREATE:
			nyPos=nyMin=1; nyMax=200; nyPage=10;
			siy.cbSize=sizeof(siy); 
			siy.fMask=SIF_ALL;
			siy.nMin=nyMin;
			siy.nMax=nyMax;
			siy.nPage=nyPage; 
			siy.nPos=nyPos;
			SetScrollInfo(hwnd, SB_VERT, &siy, TRUE);
		break;
	case WM_VSCROLL:
			switch (LOWORD(wParam))
			{ 
			case SB_PAGERIGHT:{ nyPos +=10; break;}
			case SB_LINERIGHT:{ nyPos+=1; /*siy.nPage+=1;*/ break;}
			case SB_PAGELEFT:{ nyPos-=10; break;}
			case SB_LINELEFT:{ nyPos-=1; /*siy.nPage-=1;*/ break;}
			case SB_TOP:{ nyPos=nyMin; break;}
			case SB_BOTTOM:{ nyPos=nyMax; break;}
			case SB_THUMBPOSITION:
			case SB_THUMBTRACK:{ nyPos=HIWORD(wParam); break;}
			}
			if (nyPos>nyMax) nyPos=nyMax;
			if (nyPos<nyMin) nyPos=nyMin;			
			if (siy.nPage<nyPage || siy.nPage>nyMax)
				siy.nPage=nyPage;

			siy.nPos=nyPos; 
			siy.fMask=SIF_POS | SIF_PAGE;
			SetScrollInfo(hwnd, SB_VERT, &siy, TRUE);
			break;
	case WM_KEYDOWN:
			switch (wParam)
			{
			case VK_HOME://if (HIBYTE(GetKeyState(VK_CONTROL)))
							 SendMessage(hwnd,WM_VSCROLL, SB_TOP, 0L);
				break;
			case VK_END://if (HIBYTE(GetKeyState(VK_CONTROL)))
							SendMessage(hwnd,WM_VSCROLL, SB_BOTTOM, 0L);
				break;
			case VK_UP:SendMessage(hwnd, WM_VSCROLL, SB_LINELEFT, 0L);
				break;
			case VK_DOWN:
				SendMessage(hwnd, WM_VSCROLL, SB_LINERIGHT, 0L);
				break;
			case VK_PRIOR:
				SendMessage(hwnd, WM_VSCROLL, SB_PAGELEFT, 0L);
				break;
			case VK_NEXT:
				SendMessage(hwnd, WM_VSCROLL, SB_PAGERIGHT, 0L);
				break;
			}
			break;
	case WM_DESTROY: PostQuitMessage(0); 
		             break;
	 
	}
	return DefWindowProc(hwnd, msg, wParam, lParam);
}
ps. пользуйтесь тегом [CODE] или "#"

Последний раз редактировалось counter; 15.11.2009 в 19:23.
counter вне форума Ответить с цитированием
Старый 15.11.2009, 19:38   #3
meight
 
Регистрация: 15.11.2009
Сообщений: 6
По умолчанию

Чем компилировал?! У меня древность стоит просто Borland C++ 5.2...
meight вне форума Ответить с цитированием
Старый 15.11.2009, 19:43   #4
counter
Участник клуба
 
Регистрация: 18.10.2008
Сообщений: 1,409
По умолчанию

visual studio 2008

вот те еще и колесо (авось пригодится)

Код:
case WM_MOUSEWHEEL: 
		    if(GET_WHEEL_DELTA_WPARAM(wParam)<0)
				SendMessage(hwnd, WM_VSCROLL, SB_LINERIGHT, 0L);
			else if(GET_WHEEL_DELTA_WPARAM(wParam)>0)
				SendMessage(hwnd, WM_VSCROLL, SB_LINELEFT, 0L);
			break;
counter вне форума Ответить с цитированием
Старый 15.11.2009, 20:00   #5
meight
 
Регистрация: 15.11.2009
Сообщений: 6
По умолчанию

Огромное спасибо
но теперь только тогда другой вопрос... как запустить это на борланде С++ 5.2... мне на нем надо будет это преподам показывать...
meight вне форума Ответить с цитированием
Старый 18.11.2009, 20:39   #6
meight
 
Регистрация: 15.11.2009
Сообщений: 6
Печаль HELP

ну и в вижуал 2008 все равно не запускается, даже с исправлениями вот что пишет:

asm.cpp
d:\visual studio 2008\projects\asm\asm\asm\asm.cpp(1 8) : error C2664: 'RegClass' : cannot convert parameter 2 from 'char [12]' to 'LPCTSTR'
Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
d:\visual studio 2008\projects\asm\asm\asm\asm.cpp(2 2) : error C2664: 'CreateWindowExW' : cannot convert parameter 2 from 'char [12]' to 'LPCWSTR'
Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
d:\visual studio 2008\projects\asm\asm\asm\asm.cpp(6 6) : warning C4018: '<' : signed/unsigned mismatch
d:\visual studio 2008\projects\asm\asm\asm\asm.cpp(6 6) : warning C4018: '>' : signed/unsigned mismatch



что сие означает?! чего не хватает?! что не так?!
meight вне форума Ответить с цитированием
Старый 18.11.2009, 21:07   #7
counter
Участник клуба
 
Регистрация: 18.10.2008
Сообщений: 1,409
По умолчанию

это связано с форматом строк, по умолчанию MVS создает юникодный проект, и функции API используемые в программе
будут вызываться в юникодном варианте

CreateWindowExW - юникод
CreateWindowExА - анси

в настройках проекта

Project - Properties - Configuration Properties - General - Character Set - No Set (или Use Multi-Byte Character Set)

Последний раз редактировалось counter; 18.11.2009 в 21:10.
counter вне форума Ответить с цитированием
Старый 18.11.2009, 21:20   #8
meight
 
Регистрация: 15.11.2009
Сообщений: 6
Хорошо

вон оно в чем дело)))
вот теперь все заработало
СПАСИБО
meight вне форума Ответить с цитированием
Старый 21.11.2009, 15:45   #9
meight
 
Регистрация: 15.11.2009
Сообщений: 6
Лампочка

А вот чисто теоретически, есть какие нибудь функции по созданию скрола с автоматическим отловом нажатия клавиш клавы?!
meight вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Окно в Делфи Tampl Помощь студентам 6 09.07.2009 20:54
Окно Help Djem1991 Общие вопросы Delphi 10 04.02.2009 16:35
Окно Артэс Win Api 1 13.06.2008 20:45
Окно MadDog__ Win Api 0 17.01.2008 00:33
«Окно+символ». Создать класс, представляющий окно в текстовом режиме. RustreX Паскаль, Turbo Pascal, PascalABC.NET 1 11.11.2007 19:28