Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Программирование с использованием WinAPI

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61

Открыть новую тему     Написать ответ в эту тему

TeXpert



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
N0el

Цитата:
Есть окошко, есть кнопочка - обыкновенный "BUTTON"  
нужно на эту кнопочку навесить всплывающее меню.

Странная логика приложения... Может, по-другому всё же?
 

Цитата:
Чтоб при нажатии именно на эту кнопочку выскакивало PopupMenu.  
C другой стороны само окошко не должно ловить этот вызов.

А тут противоречие -- без обработки этого события (нажатие) нельзя и сделать так чтобы "выскакивало PopupMenu". Так чего же всё-таки хотим?

----------
Майкудук, Пришахтинск не предлагать!:)
А на Пирогова приходит снова весенний гомон...

Всего записей: 3604 | Зарегистр. 08-02-2003 | Отправлено: 02:34 21-10-2006
22222



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Abs62
Ну вот, он я как понял хочет ловить BN_CLICKED, и не отправлять его дальше родителю, а показывать свое окно.

Всего записей: 446 | Зарегистр. 12-05-2003 | Отправлено: 18:29 21-10-2006
Thritt



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Возможно это уже где-то обсуждалось на форуме. я не искал, если дадите ссылки буду рад.  У меня вот такой вопрос: имеется окно, в окне одна кнопка. Вот как на эту кнопку поместить Битмап?

Всего записей: 79 | Зарегистр. 10-07-2006 | Отправлено: 21:21 21-10-2006
Qraizer



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Ставишь этой кнопке стиль BS_OWNERDRAW, и тебе будет приходить сообщение WM_DRAWITEM. Смотри MSDN для деталей.

Всего записей: 613 | Зарегистр. 08-08-2006 | Отправлено: 22:09 21-10-2006
Abs62



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
22222
Ловить где? Button BN_CLICKED не получает, он его генерирует и отправляет родителю.

Всего записей: 6080 | Зарегистр. 22-10-2005 | Отправлено: 22:10 21-10-2006
Thritt



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Qraizer
чесно говоря я не понял как сделать...  Я создаю ресурс - Битмап, загружаю в переменную HBITMAP, а что дальше с этой переменной делать я не знаю.. в MSDN читал про WM_DRAWITEM и DRAWITEMSTRUCT, но что-то толком ничего не понял
а свойство  BS_BITMAP  зачем? оно никак не может пригодиться?

Всего записей: 79 | Зарегистр. 10-07-2006 | Отправлено: 23:32 21-10-2006
Abs62



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Thritt

Цитата:
а что дальше с этой переменной делать я не знаю..  

Читать дальше про CreateCompatibleDC, SelectObject, BitBlt.

Цитата:
а свойство  BS_BITMAP  зачем? оно никак не может пригодиться?

Может.  
Если указать этот стиль для кнопки и послать ей BM_SETIMAGE c IMAGE_BITMAP в wParam и хэндлом битмапа в lParam. Тогда можно не заморачиваться с BS_OWNERDRAW.

Всего записей: 6080 | Зарегистр. 22-10-2005 | Отправлено: 01:04 22-10-2006
22222



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Abs62

Цитата:
Ловить где? Button BN_CLICKED не получает, он его генерирует и отправляет родителю.  

Поскольку он сказал, что само окно не должно ловить это сообщение, то это похоже на сабклассинг, когда одно окно генерирует сообщение, но на этапе отправки его родителю, сообщение перехватывается и обрабатывается как ему надо и далее родителю не отправляется. Но это лишь догадки и речь может идти совсем о другом, так как автора самого еще нет

Всего записей: 446 | Зарегистр. 12-05-2003 | Отправлено: 06:50 22-10-2006
Thritt



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Abs62
Значит я пишу:
 
HBITMAP bm = LoadBitmap(hInstance, MAKEINTRESOURCE(IDB_BITMAP1));
 
HWND Btn1 = CreateWindowW(TEXT("BUTTON"), NULL,  
        WS_CHILD|WS_VISIBLE|BS_BITMAP,  
        10, 130, 130, 35,
        hWnd, (HMENU)ID_BTN1,
                (HINSTANCE)GetWindowLongW(hWnd, GWL_HINSTANCE), NULL);
 
SendMessage(Btn1, BM_SETIMAGE, (WPARAM)IMAGE_BITMAP, (LPARAM)bm);
 
и ничего не получается...
 
Добавлено:
Abs62

Цитата:
Читать дальше про CreateCompatibleDC, SelectObject, BitBlt.

Все. теперь почитал повнимательнее, разобрался. Спасибо за помощь.
 
Добавлено:
Блин, теперь возникла новая проблема: как менять Битмап, расположенный на кнопке, в ходе работы программы? Например при наведении курсора мыши на кнопку, или что-нибудь подобное?

Всего записей: 79 | Зарегистр. 10-07-2006 | Отправлено: 12:18 22-10-2006
ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
Блин, теперь возникла новая проблема: как менять Битмап, расположенный на кнопке, в ходе работы программы? Например при наведении курсора мыши на кнопку, или что-нибудь подобное?

Ага вначале только выбери способ определения, что курсор наведен на кнопку (если ты не в курсе. то у кнопки нет события на вход и выход мыши, зато есть разные способы это сделать). Как только определишься со способом, реализовать отрисовку другого битмапа проще просто, копать в сторону InvalidateRect, создаешь глобальный хэндл битмапа и при событии входа мыши грузишь туда новый битмап. После этого инвалидейт и уже отрисовывается с новым битмапом.

----------
И создал Бог женщину... Существо получилось злобное, но забавное...

Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 02:11 23-10-2006
Thritt



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ShIvADeSt

Цитата:
Ага вначале только выбери способ определения, что курсор наведен на кнопку

 
А так нельзя сделать?  я просто даже не знаю как еще.
 
int x, y;
 
case WM_MOUSEMOVE:
    x = LOWORD(lParam);
    y = HIWORD(lParam);
    if (x < 10 && x > 100 && y > 130 && y < 155)
    {
          /* тут нужно нарисовать новый битмап */
    }
    else
    {
          /*  оставить старый  */
    }
    break;
 
Добавлено:
я вот что-то никак не пойму почему так получается: например если менять картинку по нажатию левой кнопки мыши в любом месте:
case WM_RBUTTONDOWN:
    bm = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_BITMAP2));
    InvalidateRect(hWnd, NULL, FALSE);
    break;  
картинка меняется  если только курсор НЕ наведен на кнопку. т.е. если щелкать в любом месте окна - картинка меняется, а если щелкнуть по кнопке то ничего не происходит.  Почему так получается?

Всего записей: 79 | Зарегистр. 10-07-2006 | Отправлено: 11:05 23-10-2006 | Исправлено: Thritt, 11:47 23-10-2006
22222



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Thritt

Цитата:
а если щелкнуть по кнопке то ничего не происходит.  Почему так получается?

 
Потому, что у кнопки свой обработчик события и она просто так не передает обработанные события родительскому окну. Могу ошибиться.

Всего записей: 446 | Зарегистр. 12-05-2003 | Отправлено: 17:18 23-10-2006
Thritt



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
А для чего нужны события BN_HILITE и BN_PUSHED ?

Всего записей: 79 | Зарегистр. 10-07-2006 | Отправлено: 19:25 23-10-2006
Abs62



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Thritt

Цитата:
А для чего нужны события BN_HILITE и BN_PUSHED ?

Из MSDN:
This notification message is provided only for compatibility with 16-bit versions of Microsoft® Windows® earlier than version 3.0. Applications should use the BS_OWNERDRAW button style and the DRAWITEMSTRUCT structure for this task.

Всего записей: 6080 | Зарегистр. 22-10-2005 | Отправлено: 21:36 23-10-2006
ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Thritt

Цитата:
case WM_RBUTTONDOWN:      bm = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_BITMAP2));      InvalidateRect(hWnd, NULL, FALSE);      break;   картинка меняется  если только курсор НЕ наведен на кнопку. т.е. если щелкать в любом месте окна - картинка меняется, а если щелкнуть по кнопке то ничего не происходит.  Почему так получается?

потому что нет у кнопки такого события, чтобы оно появилось надо перехватить обработчик ее оконного сообщения и подменить на свой, вот пример на дельфи (на С тоже примеров хватает), где то видел красивый пример на Визуале, как сделать хайлайтную кнопку, щас найти не могу.

Цитата:
 
function ButtonProc(hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
var
  point         :TPoint;
  Rect          :TRect;
begin
  case Msg of
    WM_MOUSEMOVE:
      begin
        GetCursorPos(point);
        GetWindowRect(hwnd, rect);
        if PtInRect(rect, point) then begin
          if GetCapture <> hWnd then begin
            SetCapture(hWnd);
            MouseOver:=True;
            InvalidateRect(hWnd,nil,FALSE);
          end;
        end else begin
          ReleaseCapture;
          MouseOver:=False;
          InvalidateRect(hWnd,nil,FALSE);
        end;
      end;
      end;
  result := CallWindowProc(pointer(OldProc), hWnd, Msg, wParam, lParam);
end;
 
 
а когда идет инициализация диалога пишешь след
         OldBtnProc:=SetWindowLong(GetDlgItem(hWnd,BTN_OK), GWL_WNDPROC, Integer(@ButtonProc));
 
ну и нормально пишешь  
procedure OnDrawItem(const DStr:PDRAWITEMSTRUCT);
 
 

 


----------
И создал Бог женщину... Существо получилось злобное, но забавное...

Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 02:17 24-10-2006
Jokerjar



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Кто хорошо знает winsock2? Умоляю, помогите! Пишу программу сетевую, на сервере открываю порт:
 
void __fastcall StartServer()
{
if (WSAStartup(MAKEWORD(2,0),&WSA)==0)
{
Sock=socket(AF_INET,SOCK_STREAM,0);
if (Sock!=INVALID_SOCKET)
{
address.sin_addr.s_addr = htonl(INADDR_ANY);
address.sin_family = AF_INET;
address.sin_port = htons(Port);
bind(Sock,( sockaddr  * )&address,sizeof(address));
listen(Sock,SOMAXCONN);
WSAAsyncSelect(Sock,Form1->Handle,WM_MYMSG, FD_READ | FD_ACCEPT | FD_CLOSE);
}
}
}
 
Задаю события на сообщение WM_MYMSG:
 
LRESULT CALLBACK NewWindowProc(HWND hWnd, UINT msg, WPARAM wpar,
LPARAM lpar)
{
  if (msg == WM_MYMSG)
  {
  sClient = wpar;
  if (WSAGETSELECTEVENT(lpar) == FD_READ)
    {
    recv(sClient,(char *)&n,sizeof(n),0);
    }
  if (WSAGETSELECTEVENT(lpar) == FD_ACCEPT)
    {
    accept(sClient,0,0);
    Form1->Memo1->Lines->Add("Клиент подсоединился");
    }
  if (WSAGETSELECTEVENT(lpar) == FD_CLOSE)
    {
    Form1->Memo1->Lines->Add("Клиент отсоединился");
    }
  }
  return CallWindowProc((FARPROC)Form1->OldWindowProc, hWnd, msg, wpar, lpar);
}
 
Проблема заключается в том, чтобы узнать удаленный айпишник. На этапе подключения клиента это можно узнать из функции accept. А мне нужно узнавать IP адресс каждый раз в момент принятия сообщения (recv). Как это сделать???  
 

Всего записей: 591 | Зарегистр. 22-03-2006 | Отправлено: 02:17 26-10-2006 | Исправлено: Jokerjar, 02:20 26-10-2006
pit23



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Помогите понять в чем дело:
 
Написал следующую функцию (для загрузки файла bmp) в Visual Studio 2005:
 

Код:
 
typedef struct BITMAP_FILE_TAG
{
    BITMAPFILEHEADER bitmapfileheader;  
    BITMAPINFOHEADER bitmapinfoheader;
    UCHAR *buffer;
} BITMAP_FILE,*BITMAP_FILE_PTR;
 
.....
 
int LoadBitmapFile(BITMAP_FILE_PTR bitmap,char *filename)
{
        int file_handle;
        UCHAR *temp_buffer=NULL;
        OFSTRUCT file_data;
        if((file_handle=OpenFile(filename,&file_data,OF_READ))==-1)
    return(0);
        _lread(file_handle,&bitmap->bitmapfileheader,sizeof(BITMAPFILEHEADER));
        if(bitmap->bitmapfileheader.bfType!=0x4d42)
        {
             _lclose(file_handle);
             return(0);
         }
        _lread(file_handle,&bitmap->bitmapinfoheader,sizeof(BITMAPINFOHEADER));
        _lseek(file_handle,-(bitmap->bitmapinfoheader.biSizeImage),SEEK_END);
        if(bitmap->buffer)
    delete (bitmap->buffer);
        bitmap->buffer = new UCHAR[bitmap->bitmapinfoheader.biSizeImage];
        _lread(file_handle,bitmap->buffer,bitmap->bitmapinfoheader.biSizeImage);
        _lclose(file_handle);
 
        return(1);
}
 
 

 
С компиляцей программы все OK. А вот во время исполнения не хочет нормально работать функция _lseek. Возникает ошибка времени выполнения:
 
////////////////////////////////////
Debug Assertion Failed!
 
Program: ...
File: lseek.c
Line: 66
 
Expression: (fh >= 0 && (unsigned)fh < (unsigned)_nhandle)
 
For information on how your program can cause an assertion
failure, see the Visual C++ documentation on assertion
 
(Press Retry to debug the application)
/////////////////////////////////////
 
Что это: баг Студии, я что-то не так делаю (например в настройках компилятора надо что-то заменить), или еще что-нибудь.

Всего записей: 60 | Зарегистр. 04-03-2006 | Отправлено: 16:41 10-11-2006
Abs62



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
pit23

Цитата:
Что это: баг Студии, я что-то не так делаю (например в настройках компилятора надо что-то заменить), или еще что-нибудь.

Второе. По сути, это сообщение "bad file handle".
Нельзя так смешивать функции RTL и WinAPI. С хэндлом, возвращаемым апишной функцией OpenFile (устаревшей, кстати, вместо неё необходимо использовать CreateFile) и работать надо апишными функциями - ReadFile, SetFilePointer, CloseHandle. А в функции RTL - _lread, _lseek, _lclose - надо передавать хэндл, полученный с помощью RTL-ной же функции _open.

Всего записей: 6080 | Зарегистр. 22-10-2005 | Отправлено: 21:14 10-11-2006
pit23



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Abs62
 
Просто в Visual Studio 2003 этот код нормально работал. Поэтому я и подумал что что-то не так с 2005 студией.  
И еще: ведь функция _lread нормально работает в данном случае. Если хэндл файла неправильный как это возможно ?
 
 
 
 

Всего записей: 60 | Зарегистр. 04-03-2006 | Отправлено: 09:55 13-11-2006
BugFixer

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
pit23

Цитата:
Написал следующую функцию (для загрузки файла bmp) в Visual Studio 2005:  

А не проще всё это счастье через GDI+ пользовать?

Всего записей: 482 | Зарегистр. 02-08-2003 | Отправлено: 10:41 13-11-2006
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Программирование с использованием WinAPI


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru