WinAPI GUI,подскажите

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by _nic, 31 Jan 2010.

  1. _nic

    _nic Elder - Старейшина

    Joined:
    5 May 2006
    Messages:
    651
    Likes Received:
    54
    Reputations:
    3
    1.Создаю едит
    Code:
    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,10,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,lParam);
    }//ф-ция обработки сообщений для едита
    
    В итоге графически получается место на главном окне в которое можно писать текст.
    Вопрос как задать ему цвет фона,шрифта,сделать каемку вокруг него?
    2.Создание кнопки
    Code:
    HWND hButton=CreateWindow("button",TEXT("OK!"),WS_CHILD | WS_VISIBLE | BS_DEFPUSHBUTTON ,80,80,50,30,hWnd,(HMENU)2,hInst,NULL);
    
    Вопрос почему неполучается кнопке задать обработчик событий аналогично едиту?Если пробую сделать так же,то кнопка просто не появляется :(
     
  2. Gar|k

    Gar|k Moderator

    Joined:
    20 Mar 2009
    Messages:
    1,166
    Likes Received:
    266
    Reputations:
    82
    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+ все намного проще реализуется...

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

    Code:
    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 главной функции окна
    то вот пример

    Code:
    switch(Message)
    	case WM_COMMAND:
    
    		if(wParam==BT_CLOSE)
    			{
    			AlphaClose(hWnd);
    			PostQuitMessage(0);
    			}
    return 0;
    }
    
     
    _________________________
    #2 Gar|k, 31 Jan 2010
    Last edited: 31 Jan 2010
    1 person likes this.
  3. _nic

    _nic Elder - Старейшина

    Joined:
    5 May 2006
    Messages:
    651
    Likes Received:
    54
    Reputations:
    3
    Неподскажешь какое оконное сообщение заставляет окно свернутся?
     
  4. Gar|k

    Gar|k Moderator

    Joined:
    20 Mar 2009
    Messages:
    1,166
    Likes Received:
    266
    Reputations:
    82
    ShowWindow(hWnd,SW_MINIMIZE); // программно свернуть любое окошко...

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

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

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

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

    это отрывочек из моей проги при нажатии свернуть она просто скрывается
     
    _________________________
    #4 Gar|k, 31 Jan 2010
    Last edited: 1 Feb 2010
  5. Ra$cal

    Ra$cal Elder - Старейшина

    Joined:
    16 Aug 2006
    Messages:
    670
    Likes Received:
    185
    Reputations:
    78
    почему бы не банить товарищей, которые не могут воспользоваться гуглом прежде, чем флудить в форуме?

    http://tinyurl.com/yhae7p7

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

    Gar|k Moderator

    Joined:
    20 Mar 2009
    Messages:
    1,166
    Likes Received:
    266
    Reputations:
    82
    Ra$cal тут большая часть форума не умеет пользоваться поиском... и лишь избранные вообще догадываются об msdn :) я давно это понял
     
    _________________________
  7. _nic

    _nic Elder - Старейшина

    Joined:
    5 May 2006
    Messages:
    651
    Likes Received:
    54
    Reputations:
    3
    Сам флуд разводишь,хочешь оскорбить - пиши в ЛС.
     
  8. _nic

    _nic Elder - Старейшина

    Joined:
    5 May 2006
    Messages:
    651
    Likes Received:
    54
    Reputations:
    3
    Только сейчас глянул при alt-tab неприходит такого сообщения :confused:
     
  9. Gar|k

    Gar|k Moderator

    Joined:
    20 Mar 2009
    Messages:
    1,166
    Likes Received:
    266
    Reputations:
    82
    alt+tab не сворачивает окно, а делает выбранное окно активным SetActiveWindow.... alt+esc свернуть
     
    _________________________
  10. _nic

    _nic Elder - Старейшина

    Joined:
    5 May 2006
    Messages:
    651
    Likes Received:
    54
    Reputations:
    3
    А как его вернуть назад?
    Code:
    SetActiveWindow(hWnd);
    SetFocus(hWnd);
    
    непомагает
     
  11. Gar|k

    Gar|k Moderator

    Joined:
    20 Mar 2009
    Messages:
    1,166
    Likes Received:
    266
    Reputations:
    82
    ShowWindow(hWnd, SW_RESTORE);
    http://msdn.microsoft.com/en-us/library/ms633548(VS.85).aspx

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

    _nic Elder - Старейшина

    Joined:
    5 May 2006
    Messages:
    651
    Likes Received:
    54
    Reputations:
    3
    Неа так
    Code:
    ShowWindow(hWnd,SW_RESTORE);
    ShowWindow(hWnd,SW_SHOWMAXIMIZED);
    
    то же пробовал.Точнее так
    Code:
    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
     
  13. Ra$cal

    Ra$cal Elder - Старейшина

    Joined:
    16 Aug 2006
    Messages:
    670
    Likes Received:
    185
    Reputations:
    78
    SetForegroundWindow

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

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