Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» C++ WinAPI

Автор: 22222
Дата сообщения: 23.10.2006 16:18
Thritt

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


Потому, что у кнопки свой обработчик события и она просто так не передает обработанные события родительскому окну. Могу ошибиться.
Автор: Thritt
Дата сообщения: 23.10.2006 18:25
А для чего нужны события BN_HILITE и BN_PUSHED ?
Автор: Abs62
Дата сообщения: 23.10.2006 20:36
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.
Автор: ShIvADeSt
Дата сообщения: 24.10.2006 01:17
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);



Автор: Jokerjar
Дата сообщения: 26.10.2006 01:17
Кто хорошо знает 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). Как это сделать???

Автор: pit23
Дата сообщения: 10.11.2006 15:41
Помогите понять в чем дело:

Написал следующую функцию (для загрузки файла 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);
}

Автор: Abs62
Дата сообщения: 10.11.2006 20:14
pit23

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

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

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




Автор: BugFixer
Дата сообщения: 13.11.2006 09:41
pit23

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

А не проще всё это счастье через GDI+ пользовать?
Автор: pit23
Дата сообщения: 13.11.2006 15:04
BugFixer


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


Наверное проще.
Вообще то это был пример из книги. И мне просто стало интересно узнать почему этот код в Visual C++ 2003 прекрасно работал, а в Visual C++ 2005 не хочет.
Автор: Elf23
Дата сообщения: 13.11.2006 15:45
Всем привет !!! Такой вот вопрос , где можно скачать хоть что нибудь по WinForms Visual C++!!
Зарание Спасибо
Автор: TeXpert
Дата сообщения: 13.11.2006 20:27
pit23

Цитата:
Вообще то это был пример из книги.

Интересно, какой?
Автор: Abs62
Дата сообщения: 13.11.2006 21:37
pit23

Цитата:
Вообще то это был пример из книги.

Какого года книжка? Функция OpenFile уже лет десять как устарела.

Цитата:
И мне просто стало интересно узнать почему этот код в Visual C++ 2003 прекрасно работал, а в Visual C++ 2005 не хочет.

А никто и не обещал вечной поддержки кривого кода.
Изменили реализацию библиотеки в новой версии компилятора - эта кривость и вылезла на свет божий.
Автор: pit23
Дата сообщения: 14.11.2006 12:00
TeXpert


Цитата:
Интересно, какой?

Андре Ламот. Программирование игр для Windows. Советы профессионала.

Abs62

Цитата:
Какого года книжка?

Кажется 2004 года издания.

Добавлено:
Кстати попробывал использовать в коде функцию _open. С флагом открытие файла только для чтения. В таком случае функция _lread вообще ничего из файла читать нехочет.
Автор: Qraizer
Дата сообщения: 14.11.2006 12:46
И не будет. _open - это C RTL, а _lread - это Win16 API. ИМХО в топку таких профессионалов, которые в 2004 году пользуются API, девятилетней выдержки. Может ты ошибся, и книга в 2004 году была издана у нас, а автором написана в каком-нибудь 1994-м?
Автор: pit23
Дата сообщения: 14.11.2006 14:43
Qraizer

Цитата:
Может ты ошибся, и книга в 2004 году была издана у нас, а автором написана в каком-нибудь 1994-м

Вполне возможно (по крайней мере 2004 год -- это точно год издания. Издательство Вильямс)

Незнаеш какие функции чтения, поиска в файле наиболее подходят для функции _open. ?

Автор: Abs62
Дата сообщения: 14.11.2006 17:33
pit23

Цитата:
Незнаеш какие функции чтения, поиска в файле наиболее подходят для функции _open. ?

Обычные RTL-ные - _read и _lseek.
Автор: pit23
Дата сообщения: 15.11.2006 08:34
Спасибо всем за разъяснения. Разобрался, все работает с функциями
_sopen_s, _read и _lseek.

Кстати незнаете в чем разница между функциями _sopen_s и _open. ? Таких "исключенных" (deprecated) функций довольно таки много.
Автор: Qraizer
Дата сообщения: 15.11.2006 12:25
Политика примерно такая. Все "небезопасные" функции в 2005-й студии объявлены устаревшими, чтобы программист их юзающий получил варнинг при компиляции. Если программист уверен, что он хочет использовать именно их, то пусть явно подтверждает это намерение постфисом _s. Совсем их убрать нельзя, ибо их наличие регламентируется стандартом языка.
У самого этой студии ещё нет, пользуюсь 2003-ей, так что информация - только из чужих сообщений.
Автор: pit23
Дата сообщения: 15.11.2006 13:16
Qraizer
Интересно в чем проявляется их небезопасность.
Автор: xdude
Дата сообщения: 15.11.2006 14:28
pit23

Цитата:
Интересно в чем проявляется их небезопасность.

Небезопасность по мнению MS в том, что они не защищены от переполнения буфера, и поэтому злоумышленник может воспользоваться этим чтобы, скажем, записать в нужный ему участок памяти свой код/данные. ИМХО, нормальный программист сам должен заботиться об этом в своем коде.
Qraizer

Цитата:
Если программист уверен, что он хочет использовать именно их, то пусть явно подтверждает это намерение постфисом _s.

Это не совсем так. Функции с постфиксом _s имеют защиту от переполнения буфера, имеют дополнительные параметры при вызове, и в большинстве случаев (если не во всех) возвращают совершенно другой результат. Например:

Код:
char *strcpy(
char *strDestination,
const char *strSource
);
Автор: pit23
Дата сообщения: 15.11.2006 15:24
xdude

Цитата:
нормальный программист сам должен заботиться об этом в своем коде.

В своем коде да. А RTL функции это же по сути чужой код.
Автор: xdude
Дата сообщения: 15.11.2006 15:38
pit23

Цитата:
В своем коде да. А RTL функции это же по сути чужой код.

Я и не говорю про RTL, я говорю про свой код: например, при копировании в буфер нужно убедиться, что в этом буфере достаточно места, об этом во всех мануалах пишут. Особенно трепетно нужно относиться к данным, введенным пользователем. В общем, не думаю, что кто-то не знает этих прописных истин
Автор: pit23
Дата сообщения: 15.11.2006 16:05
xdude

Цитата:
В общем, не думаю, что кто-то не знает этих прописных истин

В общем согласен.
Так что можно и не использовать эти "защищенные" функции?
Автор: xdude
Дата сообщения: 15.11.2006 16:34
pit23

Цитата:
Так что можно и не использовать эти "защищенные" функции?

Это каждый решает на свой вкус. Лично я не использую, потому что пишу кросс-платформенные приложения, и нигде, кроме как у Мелкософта, этих функций нет.
А если приложение рассчитано исключительно под винду, и будет компиляться исключительно в Visual Studio 2005+ - то почему бы и нет?
Хотя, ИМХО, эти функции из той же серии, что и вопросы "Вы действительно уверены, что хотите...", которыми и в тему, и не в тему напичкана всеми нами любимая M$ Windows
Автор: Qraizer
Дата сообщения: 15.11.2006 19:01
xdude
Ну не совсем так. Комитеты по стандартизации языков C и C++ многое хотели бы поменять в новых релизах, но не могут из соображений совместимости с уже существующими проектами. MS просто решила эту проблему хоть как-то решить. Я не думаю, что это лучший метод, но всё ж таки это лучше, чем совсем ничего.
Автор: DoctorLans
Дата сообщения: 17.11.2006 20:17
Ищу книги по winAPI (для windows XP) на родном и могучем.
Автор: Thritt
Дата сообщения: 18.11.2006 18:23
У меня такая проблема - хочу воспроизвести звуковой файл (wav). Файл находится в той же папке, где и EXE файл. Я пишу:
PlaySound(TEXT("alarm.wav"), NULL, SND_FILENAME | SND_ASYNC);
Программа не компилируется, студия (VS 2005) указывает две ошибки:

Error    1    error LNK2001: unresolved external symbol __imp__PlaySoundW@12    sound.obj    

Error    2    fatal error LNK1120: 1 unresolved externals    E:\Мои документы\Visual Studio 2005\MY PROJECTS\sound\Release\sound.exe    1    

Может как нибудь по другому можно звук воспроизвести?
Автор: TeXpert
Дата сообщения: 18.11.2006 18:39
Thritt
На память не помню, но в коды посмотри, которые идут с книгой Петзолда, там в примерах чуть ли не в самом начале книги есть пример использования этой функции.
Очевидно, ты забыл библиотеку присобачить для линкера, для этого можешь посмотреть в MSDN, какую следует подключить.

P. S. Вот: Winmm.lib.
Автор: Thritt
Дата сообщения: 18.11.2006 21:44
TeXpert

Цитата:
но в коды посмотри, которые идут с книгой Петзолда

я как раз оттуда и смотрел код. Но только там кроме #include <windows.h> ничего не включено.

Страницы: 12345678910111213141516171819202122232425262728293031323334353637

Предыдущая тема: посоветуйте книги по SQL


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.