PDA

Просмотр полной версии : WinAPI GUI,подскажите


_nic
31.01.2010, 17:22
1.Создаю едит

long pEdit;//это описанно
int _stdcall Edit(HWND hWnd, UINT uMsg, WPARAM wParam, long lParam);//глобально
////////////////////.............//////////////////////
HWND hEdit=CreateWindow("EDIT",TEXT("Hello"),WS_CHILD|WS_VISIBLE|WS_TABSTOP|ES_MULTILINE,10,1 0,200,30,hWnd,(HMENU)1,hInst,NULL);
pEdit=SetWindowLong(hEdit,GWL_WNDPROC,(long)Edit);//выполняю после создания родительского окна
//////////////////////////..........................//////////////////////
int _stdcall Edit(HWND hWnd, UINT uMsg, WPARAM wParam, long lParam)
{
return CallWindowProc((WNDPROC)pEdit,hWnd,uMsg,wParam,lPa ram);
}//ф-ция обработки сообщений для едита

В итоге графически получается место на главном окне в которое можно писать текст.
Вопрос как задать ему цвет фона,шрифта,сделать каемку вокруг него?
2.Создание кнопки

HWND hButton=CreateWindow("button",TEXT("OK!"),WS_CHILD | WS_VISIBLE | BS_DEFPUSHBUTTON ,80,80,50,30,hWnd,(HMENU)2,hInst,NULL);

Вопрос почему неполучается кнопке задать обработчик событий аналогично едиту?Если пробую сделать так же,то кнопка просто не появляется :(

Gar|k
31.01.2010, 21:27
CreateWindowEx(WS_EX_CLIENTEDGE,... для edit
SendMessage( hEdit, WM_SETFONT, (WPARAM)GetStockObject( ANSI_VAR_FONT ), 0 );
- шрифт для задать для любого элемента... ну создание шрифта например вот

HFONT hTit=CreateFont(15,6,0,0,FW_BOLD,FALSE,FALSE,FALSE ,DEFAULT_CHARSET,OUT_TT_PRECIS,CLIP_DEFAULT_PRECIS ,CLEARTYPE_QUALITY,FIXED_PITCH|FF_MODERN,_TEXT("Arial"));

В GDI+ все намного проще реализуется...

про кнопку если ты задаешь ей собственный обработчик (вопрос зачем?), то тебе нужно ее или самому отрисовывать или возвращать обработчик стандартный.


oldfunc=SetWindowLong(hbutton, GWL_WNDPROC, (LONG)&GarikBtnProc);

LRESULT CALLBACK GarikBtnProc(HWND hWnd,UINT Message, UINT wParam, LONG lParam)
{
if (CallWindowProc((WNDPROC)oldfunc, hWnd, Message, wParam, lParam)) return DefWindowProc(hWnd, Message, wParam, lParam);
return 0;
}


Ну а если ты не знал что нажатия кнопки обрабатываются в WM_COMMAND главной функции окна
то вот пример


switch(Message)
case WM_COMMAND:

if(wParam==BT_CLOSE)
{
AlphaClose(hWnd);
PostQuitMessage(0);
}
return 0;
}

_nic
01.02.2010, 00:41
Неподскажешь какое оконное сообщение заставляет окно свернутся?

Gar|k
01.02.2010, 00:58
ShowWindow(hWnd,SW_MINIMIZE); // программно свернуть любое окошко...

ну а если в своем окне нужно обработать нажатие на свернуть то...

case WM_SIZE:
if(wParam == SIZE_MINIMIZED) { ... } // делаем что-то при сворачивании
return 0;

а если нужно имеено по нажатию на кнопку свернуть то

case WM_SYSCOMMAND:
if(wParam==SC_MINIMIZE){ShowWindow(hWnd,SW_HIDE);r eturn 0;}
break;

это отрывочек из моей проги при нажатии свернуть она просто скрывается

Ra$cal
01.02.2010, 01:00
почему бы не банить товарищей, которые не могут воспользоваться гуглом прежде, чем флудить в форуме?

http://tinyurl.com/yhae7p7

туева хуча топиков о прописных истинах, описанных в мсдне вдоль и поперек.

Gar|k
01.02.2010, 01:07
Ra$cal тут большая часть форума не умеет пользоваться поиском... и лишь избранные вообще догадываются об msdn :) я давно это понял

_nic
01.02.2010, 01:19
почему бы не банить товарищей, которые не могут воспользоваться гуглом прежде, чем флудить в форуме?

http://tinyurl.com/yhae7p7

туева хуча топиков о прописных истинах, описанных в мсдне вдоль и поперек.
Сам флуд разводишь,хочешь оскорбить - пиши в ЛС.

_nic
01.02.2010, 17:55
ShowWindow(hWnd,SW_MINIMIZE); // программно свернуть любое окошко...

ну а если в своем окне нужно обработать нажатие на свернуть то...

case WM_SIZE:
if(wParam == SIZE_MINIMIZED) { ... } // делаем что-то при сворачивании
return 0;


Только сейчас глянул при alt-tab неприходит такого сообщения :confused:

Gar|k
01.02.2010, 18:05
alt+tab не сворачивает окно, а делает выбранное окно активным SetActiveWindow.... alt+esc свернуть

_nic
01.02.2010, 20:30
alt+tab не сворачивает окно, а делает выбранное окно активным SetActiveWindow.... alt+esc свернуть
А как его вернуть назад?

SetActiveWindow(hWnd);
SetFocus(hWnd);

непомагает

Gar|k
01.02.2010, 20:38
ShowWindow(hWnd, SW_RESTORE);
http://msdn.microsoft.com/en-us/library/ms633548(VS.85).aspx

_nic ты реально сначала хотя бы почитай справку...

_nic
01.02.2010, 21:04
ShowWindow(hWnd, SW_RESTORE);
http://msdn.microsoft.com/en-us/library/ms633548(VS.85).aspx

_nic ты реально сначала хотя бы почитай справку...
Неа так

ShowWindow(hWnd,SW_RESTORE);
ShowWindow(hWnd,SW_SHOWMAXIMIZED);

то же пробовал.Точнее так

DWORD WINAPI restore(LPVOID lParam)
{
for(;;)
{
if(GetActiveWindow()!=(HWND)lParam){break;}
}
ShowWindow(HWND(lParam),SW_RESTORE);
ShowWindow(HWND(lParam),SW_SHOWMAXIMIZED);
return(0);
}
.................................................. .........
case WM_KILLFOCUS:
{
CreateThread(0,0,&restore,(LPVOID)hWnd,0,0);
}
break;

Но толку 0

Ra$cal
02.02.2010, 00:59
SetForegroundWindow

Чтение списка функций как бы полезное занятие

http://msdn.microsoft.com/en-us/library/ms632595%28VS.85%29.aspx