![]() |
Модераторы: feodorv, GremlinProg, xvr, Fixin |
![]() ![]() ![]() |
|
Fixin |
|
||||||||||||||
![]() Ёжик ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1357 Регистрация: 6.1.2004 Репутация: 8 Всего: 18 |
Windows API.
Введение. Это не книга, не учебник. Это статья, призванная помочь Вам в изучении Windows API на языке C/C++, но не учит языку. Многие программы написаны с использованием макросов, описанных в заголовочном файле <WindowsX.h>. Начало. Многие, начинающие изучать API (application programming interface – интерфейс программирования приложений), удивляются объему кода, сложности и тп, говорят, что проще сделать в Borlan® Builder®. Если Вы так думаете, то зачем читаете этот текст? Вы еще здесь? Тогда продолжим серьезно и без лени. Вот простейший код: Код 1.0+NoWindow.cpp+------------------------------------------------
Код 1.0+NoWindow.cpp+------------------------------------------------Конец Что за прараметры? Начнем с параметров главной функции. Кстати, это САМАЯ главная функция. Функция WndProc (о которой позже) является главной оконной процедурой. Итак, параметры… HINSTANCE вообще интересный тип. Это своего рода дескриптор объекта (HANDLE). В первом случае (hInstance) он указывает на тот исполняемый модуль, на основе которого запущен процесс данного кода. Проще говоря, указывает на файл “NoWindow.exe”. Второй параметр (hPrevInstance) – пережиток Win16. В 32-разрядных приложениях не используется. Раньше обозначал предыдущий запущенный экземпляр данного приложения. Если не ноль, значит Бог есть! Однозначно. Третий (lpszCmdParam) – строка параметров, которые были посланы программе при запуске. Если их не было, то строка пуста. Четвертый (nCmdShow) – число, обозначающее вид окна при запуске. Например, свернутое, развернутое, нормальное. Если решили изменить состояние окна во время выполнения приложения, то это сообщение посылается в окно функцией ShowWindow, например так:
За одно, разберем параметры вызова MessageBox. Первый – дескриптор окна, к которому принадлежит сообщение. Это нужно для того, что бы Windows знала, какое окно его вызвало и, соответственно, сделать его неактивным, пока вы не ответите в нем нажатием какой-нибудь кнопки. Второй и третий – строки. Соответственно, текста сообщения и текста заголовка сообщения. Четвертый – самый интересный. В нем указывается стиль сообщения. Они находятся в файле <WinUser.h>. Смотрите MSDN. Делаем окно. Начнем сразу с кода: Код 2.0+SimWnd.cpp+------------------------------------------------
Код 2.0+SimWnd.cpp+------------------------------------------------Конец Разбор полетов. Не маленький код . Но не надо бояться – этот код копируется из приложения в приложение и не надо его учить наизусть (хотя, если есть желание…). Итак, посмотрим. Три шага создания окна: 1) Регистрация. (Register()) 2) Создание. (Create()) 3) Обработка сообщений. (WndProc()) Когда мы создаем оконное приложение, мы как бы делаем подкласс объекта «окно» благодаря этим трем шагам. Поясню. При создании кнопки (класс “button”) , регистрацию и обработку сообщений выполняет система, а создание – программист. Программист также может создать свой класс кнопки и сделать ей любые свойства такие, как подсветка или градиент. Но об этом когда-нибудь потом. При регистрации, мы сообщаем системе, в основном, название нового класса и процедуру обработки его сообщений, ну и некоторые элементы внешнего вида и другие параметры. Создание окна – тут все просто. Вызов функции CreateWindow(). А при создании нового окна, после этой вызываются ShowWindow() и UpdateWindow(). Они призваны соответственно показать и обновить окно. Самое сложное и обычно наиболее емкое по коды – это обработка сообщений. Есть такая штука – DefWindowProc – стандартная оконная процедура. Все наше окно полностью работает за счет этой процедуры. Только я поступил так, как делают многие программисты:
Просто дал ей свое название. Единственное сообщение, которое она не обрабатывает, это WM_DESTROY – сообщение о закрытии окна. Если его не обрабатывать, то окна видно не будет, но процесс так и останется. Не очень удобно. Сообщения. Все функционирование в Windows основано на сообщениях. Даже то, что вы передвигаете мышь. Точнее её перерисовка. А как их получает оконная процедура? Все начинается тут:
А продолжается тут:
Функция GetMessage получает сообщение от системы и пересылает его оконной процедуре. Там программист обрабатывает его так, как хочет. Если он этого не делает или ему этого не нужно, то оно обрабатывается стандартной процедурой. Сообщений очень много и приводить их здесь нецелесообразно – займет пару страниц. Скажу только то, что когда я не знал, как называется сообщение, то открывал файл <WinUser.h> искал WM_NULL и смотрел далее сообщения, а по названию определял назначение, далее по справке и, в конце-концов, можно найти. Рассмотрим параметры в функции WndProc: 1) Дескриптор окна, к которому относится сообщение. 2) Само сообщение. 3) Параметр сообщения. 4) Параметр сообщения. Зачем два одинаковых параметра? Во-первых, не совсем одинаковые, а во-вторых смотрим: один параметр – 32 бита и второй 32. Очень многое можно указать в 64 битах, да еще 4 с лишним миллиарда возможных сообщений. Перейдем к практическим занятиям. Делаем кнопки! Код 2.1+SimWnd.cpp+------------------------------------------------
Код 2.1+SimWnd.cpp+------------------------------------------------Конец У Вас мог возникнуть вопрос, как узнать сигнатуру функций обработки сообщений. Просто. В файле <WindowsX.h> есть такой шаблон Cls_OnXXXXX. То есть, если нам нужен обработчик сообщения WM_COMMAND, то ищем Cls_OnCommand и смотрим сигнатуру. Разбор полетов. В этом коде мы использовали два новых сообщения: WM_CREATE и WM_COMMAND. Первое программист использует для задания «предпусковых» установок и создания динамических элементов управления. В нашем примере был употреблен второй случай – создание кнопки. WM_COMMAND призвано реагировать на команды программе, в основном, от элементов управления. Например, на нажатие кнопки. Заметьте, что объем кода 2.1 не многим больше, чем в 2.0. Об этом я и говорил в начале, что основная часть кода копируется из приложения в приложение. В обработчике OnCreate вызывается функция CreateWindow, вот ее параметры: 1) Символьное название класса. 2) Название элемента или текс в новом элементе. 3) Стиль окна. Их много… 4,5,6,7) Координаты x, y, dx, dy. 8) Дескриптор окна-родителя. 9) Дескриптор меню или идентификатор элемента. 10) Дескриптор модуля. 11) Указатель на значение, которое будет послано в структуре CREATESTRUCT. В основном, этот обработчик используется для загрузки настроек, ресурсов, подключения динамических библиотек и т. п. Обработчик OnCommand имеет менее разнообразное назначение (хотя, кто знает, что можно выдумать…). Этот обработчик получает четыре параметра – дескриптор главного окна, идентификатор элемента, дескриптор этого элемента и дополнительная информация. В последнем примере обрабатывается идентификатор кнопки, который задается 9-м параметром функции CreateWindow, в котором указывается целое число, преобразованное с помощью HMENU. А пример достаточно полно показывает «способ употребления» этого обработчика. В файле тот же текст, но в формате "doc". Остаюсь без компьютера (еду в инст). Статью писал наскоро, потому прошу модераторов редактировать недостатки, сообщаяя о них на ПМ. |
||||||||||||||
|
|||||||||||||||
Fixin |
|
|||
![]() Ёжик ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1357 Регистрация: 6.1.2004 Репутация: 8 Всего: 18 |
||||
|
||||
ShadowPhoenix |
|
||||||
![]() Новичок Профиль Группа: Участник Сообщений: 4 Регистрация: 15.6.2006 Где: минск Репутация: нет Всего: нет |
По поводу первой програмки... попробовал откомпилировать в MVS2005 и получил такую козу:
что я тут не понял: 1. С какого перепугу "MessageBoxW" вместо "MessageBox", в MSDN такой фишки вообще нет... ну это ладно. 2. поповоду самого "MessageBox" в MSDN :
т.е. по логике вещей должно приводиться??? или я чего не так понимаю. далее начал химичить пытаясь его запустить хоть как-то... и пришел к такому вот обрезаному виду:
![]() ![]() ![]() Это сообщение отредактировал(а) ShadowPhoenix - 15.6.2006, 17:56 |
||||||
|
|||||||
Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 33 Всего: 183 |
Очень многие имена API, которые описаны в MSDN, есть не функции, а макросы. К ним, в частности, относится и MessageBox. На самом деле есть 2 различных ф-и: MessageBoxA и MessageBoxW. Первая используется, если приложение работает с ANSI-строками, второе - с UNICODE. Соответственно, MessageBox - это либо MessageBoxA, либо MessageBoxW. Теперь о перепуге. Неизвестно, с какого перепуга, но начиная с VC 2005, проект по умолчанию генерится как UNICODE. А мужики-то не знают... Сколько уже несчастных новичков на эти грабли наступило. Тебе всего лишь надо свои строки заменить их широкими аналогами. Т.е. добавить L перед кавычками (L"XXX"). Есть способ сделать код независимым от типа используемых символов: 1) заворачивать все строки в макрос _T: _T("XXX") 2) всегда использовать t-аналоги CRT-функций: не strlen, а _tcslen, и т.д. 3) использовать типы TCHAR, LPTSTR вместо char, LPSTR... Теперь ты знаешь, что твое приложение настроено на UNICODE ![]() Это сообщение отредактировал(а) Earnest - 15.6.2006, 18:36 -------------------- ... |
|||
|
||||
maxim1000 |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 2 Всего: 110 |
ShadowPhoenix, возможно, эта тема будет полезна:
http://forum.vingrad.ru/index.php?showtopi...p;hl=messagebox -------------------- qqq |
|||
|
||||
0x07L |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 272 Регистрация: 10.6.2006 Где: Москва Репутация: 4 Всего: 5 |
Конечно, я здесь далеко не самый умный, но попытаюсь тебе помочь.
MessageBox, CreateWindow и еще много функций, которые ты встретишь в MSDN - это макросы вида #ifdef _UNICODE #define SomeFunction(...) SomeFunctionW (...) #else #define SomeFunction(...) SomeFunctionA (...) #endif Открой WinUser.h и найдешь там множество таких конструкций (в т.ч. и для MessageBox). Суть конструкций в следующем: если где-нибудь в проекте объявлен _UNICODE (это можно сделать с помощью директивы препроцессора #define или установить в свойствах проекта), то препроцессор (специальная вещь, обрабатывающая твой исходный код перед тем, как последний попадет в компилятор) заменяет вызовы функции SomeFunction на вызовы функции SomeFunctionW. Если _UNICODE не объявлен, подставляется вызов функции SomeFunctionA (A значит ANSI). Так в сообщении об ошибках появился MessageBoxW. Именно MessageBoxW, а не MessageBoxA, поскольку в 2005ой Студии Юникод по умолчанию включен. Если он тебе не нужен, его можно отключить в свойствах проекта, и никаких ошибок при компиляции примера у тебя не будет (будет, правда, пара предупреждений о том, что ты злонамеренно отключил Юникод). Зачем нужен этот Юникод? Дело в том, что обычно текстовые символы кодируются значениями от 0 до 255, занимающими 1 байт. Естественно, что 256 символов недостаточно, чтобы закодировать символы всех национальных алфавитов. На наших с тобой компьютерах русские символы кодируются значениями где-то в интервале 128..255. В индийских, для примера, версиях винды такие же коды будут соответствовать совсем другим символам. Таким образом, у разработчика слишком мало возможностей для локализации своего продукта. Для того чтобы дать разработчику такие возможности, и был придуман Юникод, в котором каждый символ кодируется двумя байтами (на самом деле все несколько сложнее, но в общем дело обстоит именно так). Для того чтобы обеспечить поддержку Юникода, в заголовочных файлах windows.h и tchar.h объявлено несколько полезных типов данных и макросов. Во-первых, чтобы все строковые литералы, которые имеются в твоей программе, нужно пометить как "юникодовые". Ставишь перед ними букву L. "Сказала собака баскервилей." -> L"Сказала собака баскервилей." Есть полезный макрос _TEXT("..."), чтобы подставлять букву L, когда объявлен _UNICODE. "Сказала собака баскервилей." -> _TEXT("Сказала собака баскервилей.") Во-вторых, пометить нужно и символьные константы. Делать это проще всего с помощью макроса _T. 'Ю' -> _T('Ю') В-третьих, вместо char нужно использовать wchar_t, а лучше макрос TCHAR. char a; -> TCHAR a; В-четвертых, указатели на char не забудь поменять на указатели на TCHAR, они же LPTSTR. char * MyString; -> TCHAR * MyString = LPTSTR MyString. Что такое LPCWSTR и прочие LP...STR, можно узнать в MSDN (ищи Windows Data Types). Вот в принципе, и все. Внимание! Макрос TCHAR объявлен в tchar.h. Подключи его #include <tchar.h> Это сообщение отредактировал(а) 0x07L - 15.6.2006, 21:32 |
|||
|
||||
ShadowPhoenix |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 4 Регистрация: 15.6.2006 Где: минск Репутация: нет Всего: нет |
понял, въехал и разобрался... а вообще по науськаванию комнилятора перешел на класс wchar_t ... пока все работает
![]() Всех благодря за помощь и понимание ![]() |
|||
|
||||
ShadowPhoenix |
|
||||||||||||
![]() Новичок Профиль Группа: Участник Сообщений: 4 Регистрация: 15.6.2006 Где: минск Репутация: нет Всего: нет |
![]() ну в данном случае
можно заменить на
а вот дальше... Совершенно непонятно откуда береться параметр pCreateStruct при вызове
так же хотелось бы получить комментарии к параметрам функции
попробовал изменить
на
![]() ![]() PS. Вначале думал здесь тему оставить, но тут вопросов по приведённому тексту всетки больше Это сообщение отредактировал(а) ShadowPhoenix - 16.6.2006, 17:18 |
||||||||||||
|
|||||||||||||
0x07L |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 272 Регистрация: 10.6.2006 Где: Москва Репутация: 4 Всего: 5 |
2_ShadowPhoenix
Пользуйся поиском. В WindowsX.h: #define HANDLE_MSG(hwnd, message, fn) \ case (message): return HANDLE_##message((hwnd), (wParam), (lParam), (fn)) Здесь вместо HANDLE_MSG в зависимости от message подставляется другой макрос (HANDLE_WM_CREATE для WM_CREATE, HANDLE_WM_COMMAND для WM_COMMAND) В том же WindowsX.h (немного ниже): #define HANDLE_WM_CREATE(hwnd, wParam, lParam, fn) \ ((fn)((hwnd), (LPCREATESTRUCT)(lParam)) ? 0L : (LRESULT)-1L) LPCREATESTRUCT - это есть то же самое, что CREATESTRUCT * Вот откуда CREATESTRUCT В WindowsX.h: #define HANDLE_WM_COMMAND(hwnd, wParam, lParam, fn) \ ((fn)((hwnd), (int)(LOWORD(wParam)), (HWND)(lParam), (UINT)HIWORD(wParam)), 0L) id - это LOWORD(wParam) Для того чтобы разобраться в этих макросах, посмотри в MSDN описание сообщений WM_CREATE и WM_COMMAND. PS Кстати, воспользуясь случаем, порекомендую книжку Румянцева "Азбука программирование в Win32 API" (вроде так) Хорошая книжка для начинающих. |
|||
|
||||
ShadowPhoenix |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 4 Регистрация: 15.6.2006 Где: минск Репутация: нет Всего: нет |
||||
|
||||
Dmitry_177 |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 418 Регистрация: 22.9.2006 Репутация: нет Всего: нет |
Я новичек в Visual C++, решил слезть с Delphi и писать на VC++. Подскажите пожалуйста, как создавать API-приложения VC++? Создаю я новый проект "Win32 Project", потом на сколько я понимаю "stdafx.h" не нужен для написания программ на чистом API, то я его удаляю и в Solution Explorer-е тоже, там еще и "stdafx.cpp".. потом удаляю всю заготовку кода и пишу следующее:
Возникает такое сообщение "c:\apiwindow\apiwindow.cpp(83) : fatal error C1010: unexpected end of file while looking for precompiled header. Did you forget to add '#include "stdafx.h"' to your source? И exe-файл не создается... Что делать? Нужен ли этот stdafx и как с ним обходиться? |
|||
|
||||
maxim1000 |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 2 Всего: 110 |
stdafx используется для прекомпилированных заголовков, это не зависит от использования WinAPI (насколько я знаю)
при создании проекта в VC++2005 можно снять галочку "Precompiled headers", в двургих версиях - не помню... -------------------- qqq |
|||
|
||||
Dmitry_177 |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 418 Регистрация: 22.9.2006 Репутация: нет Всего: нет |
У меня тоже VS2005 убрал я "Precompiled headers" только я не увидел там галочки, а выбрал из списка "Not Using Precompiled Headers" в параметре "Create/Use Precompiled Header".. с stdafx теперь проблем вроде как нету, но теперь появились другие ошибки:
1: "c:\api\api\api.cpp(30) : warning C4244: 'return' : conversion from 'WPARAM' to 'int', possible loss of data" - на строке return "Msg.wParam;" в функции WinMain. 2: "c:\api\api\api.cpp(46) : error C2440: '=' : cannot convert from 'char [7]' to 'LPCWSTR'" - на строке "WndClass.lpszClassName = szAppName;" в функции Register. 3: "c:\api\api\api.cpp(57) : error C2664: 'CreateWindowExW' : cannot convert parameter 2 from 'char [7]' to 'LPCWSTR'" - на строке "HWND hwnd = CreateWindow(szAppName, szAppName, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL);" в функции Create. Подскажите пожалуйста, что опять не так? Это сообщение отредактировал(а) Dmitry_177 - 12.10.2006, 12:19 |
|||
|
||||
maxim1000 |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 2 Всего: 110 |
2 и 3 связаны с одним изменением в VC++2005
раньше по умолчанию define UNICODE не добавлялся, так что программа получалась ANSI, ну и функции, соответственно, с окончанием A в VC++2005 UNICODE по умолчанию включён, так что надо сделать одно из двух: 1. передавать всем API-функциям unicode'овские строки (L"qqq") (ну или использовать TEXT("qqq"), чтобы универсально было) 2. залезть в свойства проекта и Use Unicode set первое - всего лишь предупреждение в принципе, конечно, можно внимания на него не обращать лично я предпочитаю в таких случаях написать явное преобразование (конечно же после того, как проанализирую, корректно ли оно), это приводит к тому, что если ошибка и будет, то её, по крайней мере, будет видно, что ускоряет её поиск... -------------------- qqq |
|||
|
||||
ressac |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 345 Регистрация: 25.11.2006 Репутация: нет Всего: 1 |
я компилю первые два примера под gcc и у меня вместе с окном открывается консоль, как этого избежать?
|
|||
|
||||
W4FhLF |
|
|||
![]() found myself ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2831 Регистрация: 2.12.2006 Репутация: 12 Всего: 121 |
ressac, ну так создавай проект не консольный или что-нибудь вроде
#pragma comment(linker, "/SUBSYSTEM:WINDOWS") напиши -------------------- "Бог умер" © Ницше "Ницше умер" © Бог |
|||
|
||||
ressac |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 345 Регистрация: 25.11.2006 Репутация: нет Всего: 1 |
W4FhLF, да там проект особо не создашь
![]()
не помогло |
|||
|
||||
W4FhLF |
|
|||
![]() found myself ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2831 Регистрация: 2.12.2006 Репутация: 12 Всего: 121 |
Что значит консольный компиль? Это зависит от поля Subsystem в заголовке PE файла. g++ -Xlinker --subsystem -Xlinker windows main.cpp -o main.exe Всё работает. -------------------- "Бог умер" © Ницше "Ницше умер" © Бог |
|||
|
||||
nerezus |
|
|||
![]() Вселенский отказник ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3330 Регистрация: 15.6.2005 Репутация: нет Всего: 43 |
|
|||
|
||||
101 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 1 Регистрация: 6.6.2007 Репутация: нет Всего: нет |
![]() |
|||
|
||||
Dronchik |
|
|||
![]() Звукач ёмаё ![]() ![]() Профиль Группа: Участник Сообщений: 451 Регистрация: 1.5.2007 Репутация: нет Всего: 37 |
А ты выбирай emptu proect а потом создовай файл С++ и пиши там что хочеш -------------------- Вместо слов делай дело, от которого ты фанатеешь. (с) |
|||
|
||||
DominiK |
|
||||||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 77 Регистрация: 11.3.2007 Где: Россия, Омск Репутация: нет Всего: нет |
MessageBox(NULL, L"Сказала собака баскервилей.",L "Ну, здравствуй, Герасим.", MB_OK|MB_ICONEXCLAMATION); Это сообщение отредактировал(а) DominiK - 8.7.2007, 22:51 |
||||||||
|
|||||||||
LinuxanT |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 57 Регистрация: 21.10.2007 Репутация: нет Всего: нет |
такую тему закрепить наверху имхо надо...
![]() посоветуйте учебник по WinAPI пожалуйста... ![]() ------------------------- все нашел... ссылки на них есть в важных... PS и почему функции удаления своего сообшения тут нед((( Это сообщение отредактировал(а) LinuxanT - 15.2.2008, 07:21 |
|||
|
||||
pycha |
|
|||
![]() главный анастазиолог ![]() Профиль Группа: Участник Сообщений: 239 Регистрация: 20.6.2008 Где: Украина Репутация: нет Всего: 13 |
драсте у меня была аналогичная трабла, не хотело компилировать я почитал эту тему раскинул мозгами изменил код и скомпилировало нормально(код из книги " win32 API Эфективная разработка приложений" . Вот что у меня получилось
но почемуто при запуске выкидывает месаж что несоздается главное окно. Подскажите что тут не так. --------------------
ищу хакера со знанием компьютера длятехкт |
|||
|
||||
mekhanikus |
|
||||
Вольноопределяющийся ![]() Профиль Группа: Участник Сообщений: 186 Регистрация: 16.6.2008 Где: Спасск-Дальний Репутация: 1 Всего: 1 |
Попробуй так:
Если окно создалось успешно, то hMianWnd != 0. |
||||
|
|||||
pycha |
|
|||
![]() главный анастазиолог ![]() Профиль Группа: Участник Сообщений: 239 Регистрация: 20.6.2008 Где: Украина Репутация: нет Всего: 13 |
да оно! Самое стыдное што несколько раз сверял с книгой и не заметил.
--------------------
ищу хакера со знанием компьютера длятехкт |
|||
|
||||
pycha |
|
|||
![]() главный анастазиолог ![]() Профиль Группа: Участник Сообщений: 239 Регистрация: 20.6.2008 Где: Украина Репутация: нет Всего: 13 |
Еще одно. Теперь попал на такую заковырку.
Вобщем вот ошибки. g:\documents and settings\pycha.pycha-1366613\мои документы\visual studio 2008\projects\project2\textviver\textviver\kdocument.cpp(14) : error C2664: 'std::basic_istream<_Elem,_Traits> &std::basic_istream<_Elem,_Traits>::get(_Elem *,std::streamsize)' : cannot convert parameter 1 from 'wchar_t [200]' to 'char *' with [ _Elem=char, _Traits=std::char_traits<char> ] Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast g:\documents and settings\pycha.pycha-1366613\мои документы\visual studio 2008\projects\project2\textviver\textviver\kdocument.cpp(16) : error C2440: '<function-style-cast>' : cannot convert from 'wchar_t [200]' to 'std::string' No constructor could take the source type, or constructor overload resolution was ambiguous g:\documents and settings\pycha.pycha-1366613\мои документы\visual studio 2008\projects\project2\textviver\textviver\kdocument.cpp(110) : error C2664: 'TextOutW' : cannot convert parameter 4 from 'const char *' to 'LPCWSTR' Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast g:\documents and settings\pycha.pycha-1366613\мои документы\visual studio 2008\projects\project2\textviver\textviver\kdocument.cpp(112) : error C2664: 'TabbedTextOutW' : cannot convert parameter 4 from 'const char *' to 'LPCWSTR' Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast как нужно правильно передавать unicode wchar_t символы апи функциям вместо обычного char Это сообщение отредактировал(а) pycha - 5.8.2008, 00:09 --------------------
ищу хакера со знанием компьютера длятехкт |
|||
|
||||
Dem_max |
|
||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1780 Регистрация: 12.4.2007 Репутация: 16 Всего: 39 |
Так и передавай в 1. TextOutW(...., _T("Привет"),...); 2. TextOut(...., _T("Привет"),...); 3. TextOutW(...., L"Привет",...); 4. TextOut(...., L"Привет",...);
стринг строка должна быть как char, поэтому компилятор и ругается что не может преобразовать wchar_t в char, задавай явно в char -------------------- Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte") |
||||
|
|||||
pycha |
|
|||
![]() главный анастазиолог ![]() Профиль Группа: Участник Сообщений: 239 Регистрация: 20.6.2008 Где: Украина Репутация: нет Всего: 13 |
cannot convert from 'wchar_t [200]' to 'std::string'
-нащет этого понятно, но как быть с TextOut если 4 параметр у него lines[i].c_str() это (как я понял это в стандартной библиотеке) не изменять же ее. TextOut(hdc,x,y,lines[i].c_str(), lines[i].size()); --------------------
ищу хакера со знанием компьютера длятехкт |
|||
|
||||
pycha |
|
|||
![]() главный анастазиолог ![]() Профиль Группа: Участник Сообщений: 239 Регистрация: 20.6.2008 Где: Украина Репутация: нет Всего: 13 |
поднимаю тему. Что так никто и не подскажет?
--------------------
ищу хакера со знанием компьютера длятехкт |
|||
|
||||
mekhanikus |
|
||||
Вольноопределяющийся ![]() Профиль Группа: Участник Сообщений: 186 Регистрация: 16.6.2008 Где: Спасск-Дальний Репутация: 1 Всего: 1 |
Вообщето, TextOut определяется так: BOOL TextOut( HDC hdc, // handle of device context int nXStart, // x-coordinate of starting position int nYStart, // y-coordinate of starting position LPCTSTR lpString, // address of string int cbString // number of characters in string ); Поэтому создавай строку
и передавай ее в TextOut. И будет тебе счастье. |
||||
|
|||||
nerezus |
|
|||
![]() Вселенский отказник ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3330 Регистрация: 15.6.2005 Репутация: нет Всего: 43 |
pycha, в настройках проекта отключи UNICODE.
|
|||
|
||||
pycha |
|
|||
![]() главный анастазиолог ![]() Профиль Группа: Участник Сообщений: 239 Регистрация: 20.6.2008 Где: Украина Репутация: нет Всего: 13 |
Я сделал явный вызов - TextOutA так и решил проблему.
Подскажите где в visual studio 2008 найти графический редактор. Вродебы переикал все , чтото не верится что его там нет. --------------------
ищу хакера со знанием компьютера длятехкт |
|||
|
||||
Partizan |
|
|||
![]() Let's do some .NET ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 2828 Регистрация: 19.12.2005 Где: Санкт-Петербург Репутация: нет Всего: 67 |
pycha, на самом деле полноценного графического редактора там нет)....да и не нужен он...если только несколько пикселей поменять в иконке...
Добавлено через 36 секунд
имхо такие вызовы - это моветон. -------------------- СУВ, Partizan. |
|||
|
||||
pycha |
|
|||
![]() главный анастазиолог ![]() Профиль Группа: Участник Сообщений: 239 Регистрация: 20.6.2008 Где: Украина Репутация: нет Всего: 13 |
А какую прогу можно использовать для этого назначения? paint черезчур неудобный. и не сохраняет файлы в разшерении ico
Я сохранил рисунок в bmp и переименовал в ico . Хотя винда воспренимает корректно, но при компиляции выдало ошибку.
Что же тут делать? Иначе надо либо отключать юникоде, что я нехочу , или делать функцию которая конвектирует с ansi в unicode. Добавлено @ 14:26 это во всяком случае мне извесные варианты Это сообщение отредактировал(а) pycha - 11.8.2008, 17:19 --------------------
ищу хакера со знанием компьютера длятехкт |
|||
|
||||
pycha |
|
|||
![]() главный анастазиолог ![]() Профиль Группа: Участник Сообщений: 239 Регистрация: 20.6.2008 Где: Украина Репутация: нет Всего: 13 |
то каким фоторедактором пользоватся?
--------------------
ищу хакера со знанием компьютера длятехкт |
|||
|
||||
Dem_max |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1780 Регистрация: 12.4.2007 Репутация: 16 Всего: 39 |
Для работы с иконками я юзаю мощную и удобную прогу ArtIcons Pro 4.21, она разработана нашими. Советую.
-------------------- Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte") |
|||
|
||||
nerezus |
|
|||
![]() Вселенский отказник ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3330 Регистрация: 15.6.2005 Репутация: нет Всего: 43 |
|
|||
|
||||
pycha |
|
|||
![]() главный анастазиолог ![]() Профиль Группа: Участник Сообщений: 239 Регистрация: 20.6.2008 Где: Украина Репутация: нет Всего: 13 |
В старом visual studio 6 он был. В книге описано его использование.
Сейчас ее поищу. --------------------
ищу хакера со знанием компьютера длятехкт |
|||
|
||||
nvrskozzy |
|
|||
Новичок Профиль Группа: Участник Сообщений: 3 Регистрация: 16.8.2008 Репутация: нет Всего: нет |
Блин. чё-то всё сложно. не подробно расписано :(
А можно где-нибудь почитать поподробнее и с самых азов этого winapi? Нифига не ясно =\ |
|||
|
||||
mekhanikus |
|
|||
Вольноопределяющийся ![]() Профиль Группа: Участник Сообщений: 186 Регистрация: 16.6.2008 Где: Спасск-Дальний Репутация: 1 Всего: 1 |
Ищи К. Г. Финогенова "WIN32 основы ПРОГРАММИРОВАНИЯ",
все разжевано, осталось проглотить. |
|||
|
||||
Иван4444 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 32 Регистрация: 14.8.2008 Репутация: нет Всего: нет |
такой трабл: к примеру ест ьчисло int j =5;
хочется его вывести в MessageBox'е , использую всюду unicod, как это селать?.. не один макрос не подходит. |
|||
|
||||
Иван4444 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 32 Регистрация: 14.8.2008 Репутация: нет Всего: нет |
есе такая задачка : если есть текст, скажем "барабас" то чтобы его вывести достаточно добавить L , а если скажем это переменная (текстовая) , то там надо извращаться.. то добавлять LPWSTR то есче что.... может скажете логику такого решения?... почему именно так?.. и может ест ьу кого небольшая шпаргалка чтобы быстро конвертировать эти значения.
|
|||
|
||||
Dem_max |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1780 Регистрация: 12.4.2007 Репутация: 16 Всего: 39 |
#include <tchar.h>
int j=5; TCHAR txt[50]; wsprintf(txt, _T("%d"), j); MessageBox(NULL, txt, _T("Число"), MB_OK); MessageBox(NULL, _T("Это было число"), _T("Число"), MB_OK); пользуйся макросом _T() это избавит тебя с переходами с юникода на char и наоборот, а L это задание чисто юникодовской строки. -------------------- Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte") |
|||
|
||||
Иван4444 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 32 Регистрация: 14.8.2008 Репутация: нет Всего: нет |
пасиб )
|
|||
|
||||
Sanek123 |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 201 Регистрация: 22.10.2008 Репутация: нет Всего: нет |
Хорошо, положим, получилось окно приложения:
Кто-нибудь подскажет, как теперь на форме рисовать кнопку, поле ввода и т.д. Если можно с примером... ![]() --------------------
Вас разыскивают бойцы 139-го порта... |
|||
|
||||
GoldFinch |
|
|||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: 2 Всего: 26 |
CreateWindow(_T("BUTTON"),....,hwnd,....);
CreateWindow(_T("EDIT"),....,hwnd,....); |
|||
|
||||
thefree |
|
|||
Новичок Профиль Группа: Участник Сообщений: 33 Регистрация: 14.11.2007 Репутация: нет Всего: нет |
Возникает вопрос, отрисовал я кнопочки и поля по средствам CreateWindow в WM_CREAT, в общей суми у меня их получилось 7 штук, после нажатия на кнопку мне надо вывести совсем другое окно. Вопрос заключается в том что мне теперь удалять 7 элементов через destroywindow и отрисовывать новое окно занова? или есть другой более красивый подход.
И еще маленький вопрос, у меня есть функция которая выполняется 30 секунд, по оканчанию её выполнения результат я вывожу через CreateWindow как текст, до этого я хочу чтобы на мести выводимого результата рисовалось "Ожидаем", но оно не отрисовывается ... пока не выполнятся функция, да и многие компоненты указаны до запуска функции не отрисовываются. |
|||
|
||||
Forsaken |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 193 Регистрация: 30.12.2008 Репутация: нет Всего: 3 |
Здравствуйте.
Создал проект на VS2008 откомилировал под WinXP SP3 -все нормально, только вот когда принес EXE на другой компьютер оказалось что он не работает ("не могу запустить из-за неправильной параллельной конфигурации, см. подробности в журнале") в debug/release. Настройки компилятора не трогал (манифест тоже не трогал). Подскажите, пожалуйста, какие настройки нужно устанавливать для того чтобы мой проект заработал на висте? |
|||
|
||||
![]() ![]() ![]() |
Правила форума "C/C++: Системное программирование и WinAPI" | |
|
На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы . Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |