Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум на Исходниках.RU > Visual C++ / MFC / WTL > 2 вопросa по winapi |
Автор: Jeno 27.12.06, 18:59 |
№1 Создал win32 aplication в VC++ 2005 (winapi приложение)...в общем, все диалоги и т.д. можно редактировать через оч удобный редактор.. (все это чудо хранится в rc файле)..но я хочу чтоб главное окно тоже бралось с rc, так на много удобней его рисовать №2 Пытаюсь исползовать MessageBox(); пишу вот так: "MessageBox(NULL,"TEST!",NULL,0);" И оно мне: cannot convert parameter 2 from 'const char [5]' to 'LPCWSTR' Если пишу вот так: "MessageBox(NULL,LPCWSTR("TEST!"),NULL,0);" ошибок нет, но вместо текста выводятся какие-то карлякули... Надеюсь вопросы не слишком тупые Спасибо заранее |
Автор: cozzzy 27.12.06, 19:02 |
1. Главное тока руками 2. MessageBox(NULL,L"TEST!",L"",0); |
Автор: Jeno 27.12.06, 19:03 |
жалко |
Автор: Hryak 27.12.06, 20:10 |
Лучше MessageBox(NULL, _T("TEST!"),_T(""),0); |
Автор: Jeno 27.12.06, 22:43 |
есть щее пару вопросов... 1.как узнать какой тип данных у переменной? 2.как перевести с одного типа в другой? например LPWSTR в u_short... и откуда вообще вы узнаете как переводить с одного типа данных в другой?!их же не мерено...и в мсдн я даже не представляю что написать... з.ы.может где-то дока есть...возможно список все типов данных... |
Автор: evGenius 28.12.06, 04:25 |
Да их вообще мало, просто такие типы, как LPWSTR всего лишь являются макросами и LPWSTR это всего лишь (wchar_t *) data conversion routines Посмотри на typeid() |
Автор: alexander.stoyan 28.12.06, 08:14 |
1. чтобы главное было в .rc файле - создавай MFC Dialog 2. MessageBox(NULL, TEXT("Hello !!!"), NULL, MB_OK) - без подключения MFC MessageBox(NULL, _T("Hello !!!"), NULL, MB_OK) - с подключением MFC если хочешьо задавать явно, то: <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> MessageBoxA(NULL, "Hello !!!", NULL, MB_OK); // ANSI MessageBoxW(NULL, L"Hello !!!", NULL, MB_OK); // Unicode непонятно токо, зачем переводить LPWSTR в u_short??? LPWSTR - это указатель (4 байта), а u_short - число (2 байта)... потери будут ! |
Автор: ElcnU 28.12.06, 08:34 |
Цитата alexander.stoyan, 28.12.2006, 10:14:30, 1394212 1. чтобы главное было в .rc файле - создавай MFC Dialog разницы помоему нет какой тип проекта если MFC то лезим в InitInstance и там решаем кто будет главным. если АПИ, то помоему там тоже всё понятно |
Автор: Jeno 28.12.06, 11:55 |
есть поле для ввода текста, оно возвращет данные в LPWSTR, нужно эти данные вставить в функцию... вот смотрите: вот так вот появляется ошибка...потому что inet_addr() и htons() ругается на то что port и host являются LPWSTR... <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> char port[10] = ""; char host[50] = ""; GetDlgItemText(hDlg,IDC_PORT,LPWSTR(port),10); GetDlgItemText(hDlg,IDC_HOST,LPWSTR(host),50); clientService.sin_addr.s_addr = inet_addr(host); clientService.sin_port = htons(port); и я не знаю как переконвертировать....пробовал вот так: <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> ошибок нет, но данные повреждаются... clientService.sin_port = htons(u_short(port)); |
Автор: alexander.stoyan 28.12.06, 11:58 |
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> char port[10] = ""; char host[50] = ""; GetDlgItemTextA(hDlg,IDC_PORT,port,10); GetDlgItemTextA(hDlg,IDC_PORT,host,50); clientService.sin_addr.s_addr = inet_addr(host); clientService.sin_port = htons(port); |
Автор: ElcnU 28.12.06, 12:10 |
может так? <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> int WideCharToMultiByte( UINT CodePage, // code page DWORD dwFlags, // performance and mapping flags LPCWSTR lpWideCharStr, // wide-character string int cchWideChar, // number of chars in string LPSTR lpMultiByteStr, // buffer for new string int cbMultiByte, // size of buffer LPCSTR lpDefaultChar, // default for unmappable chars LPBOOL lpUsedDefaultChar // set when default char used ); |
Автор: Jeno 28.12.06, 12:23 |
Цитата ElcnU @ может так? <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> int WideCharToMultiByte( UINT CodePage, // code page DWORD dwFlags, // performance and mapping flags LPCWSTR lpWideCharStr, // wide-character string int cchWideChar, // number of chars in string LPSTR lpMultiByteStr, // buffer for new string int cbMultiByte, // size of buffer LPCSTR lpDefaultChar, // default for unmappable chars LPBOOL lpUsedDefaultChar // set when default char used ); это для винапи? з.ы.мне нужно научится переводить типы данных....или не возможно перевести LPWSTR в u_short??? -Added Цитата alexander.stoyan @ <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> char port[10] = ""; char host[50] = ""; GetDlgItemTextA(hDlg,IDC_PORT,port,10); GetDlgItemTextA(hDlg,IDC_PORT,host,50); clientService.sin_addr.s_addr = inet_addr(host); clientService.sin_port = htons(port); port и host приходится переводить в LPWSTR, так как GetDlgItemText() ругается....просит LPWSTR а не char.... |
Автор: alexander.stoyan 28.12.06, 12:28 |
а ты точно GetDlgItemTextA написал? |
Автор: ElcnU 28.12.06, 12:42 |
Цитата Jeno, 28.12.2006, 14:23:56, 1394613 з.ы.мне нужно научится переводить типы данных....или не возможно перевести LPWSTR в u_short??? ну и переведёшь в соответствии с требуемой кодировкой |
Автор: Jeno 28.12.06, 13:35 |
вот смотрите: <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> void mconnect(u_short port, char *host) { ... clientService.sin_addr.s_addr = inet_addr("127.0.0.1"); clientService.sin_port = htons(port); ... } char port[10] = ""; char host[50] = ""; GetDlgItemTextA(hDlg,IDC_PORT,port,10); GetDlgItemTextA(hDlg,IDC_HOST,host,50); mconnect(u_short(port),host); ошибок нет, но данные повреждаются (когда в поле (IDC_PORT) вписываю порт 8090 то клиент пытается подконнектится и потом выдает ошибку...но если я в htons(port); вместо переменной port вписываю просто 8090 то все ок)...где нужно исправить?! и помечу??? з.ы.сори за наглость...больше не у кого спросить.. |
Автор: LuckLess 28.12.06, 13:58 |
Jeno char a[3] = "30"; это срока! строка состоит из 3-х символов, каждый по байту. первый символ - '3', второй - '0', третий - символ конца строки - '\n'; тебе нужет u_short, что есть unsigned short, что есть 2 байтоное целое число!! хоть строка и есть число, но представлена она в совершенно другом формате! Откуда компьютер знает что те символы которые ты ввел - это число в конце концов? Это должен знать (и проверять) ты!! и затем из этих символов сделать нормальное, понятное компьютеру число! для этого есть ряд средств. из чистого C++ есть строковые потокаи для узких и широких символоа (stringstream, wstringstream) на апи есть atoi, wtoi |
Автор: wertyman 29.12.06, 04:19 |
хочу не согласится, конец строки это \0! а по делу, у человека помоему в проекте прописано #define UNICODE, если у него компилятор постоянно пытается подсунуть ему Unicode АПИшки... |
Автор: LuckLess 29.12.06, 08:41 |
ну да.. Цитата wertyman @ а по делу, у человека помоему в проекте прописано #define UNICODE, если у него компилятор постоянно пытается подсунуть ему Unicode АПИшки... ну да.. виндовый проект по умолчанию юникодный вродебы.. |
Автор: wertyman 29.12.06, 11:42 |
Вот блин, это 2005 такие чудеса выдает чтоли ? И зачем оно надо, пусть человек работает нормально со строками... |
Автор: LuckLess 29.12.06, 12:22 |
а чем тебе широкие строки не нормальные? |
Автор: mad_avenger 29.12.06, 17:22 |
ответ на 1-й вопрос: Рисуй главное окно в редакторе, а показывай его так: <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> void Main() { DialogBox(GetModuleHandle(NULL),(LPCSTR)IDD_DIALOG1,NULL,DlgProc); } Тупой пример из э-э... статьи... : <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> #include "windows.h" #include "resource.h" char msg[1000]; char buf[100]; char bigb[100]; char minb[100]; INT_PTR CALLBACK DlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch (uMsg) { case WM_INITDIALOG: SetClassLong(hwndDlg, GCL_HICON, (LONG)LoadIcon(GetModuleHandle(NULL), MAKEINTRESOURCE(IDI_ICON1))); break; case WM_COMMAND: if (HIWORD(wParam)==BN_CLICKED) { switch(LOWORD(wParam)) { case IDOK: GetDlgItemText(hwndDlg,IDC_EDIT1,buf,100); lstrcpy(bigb,buf); lstrcpy(minb,buf); CharUpper(bigb); CharLower(minb); wsprintf(msg,"Пароль: '%s'\nБольшими: '%s'\nМаленькими: '%s'\nЧислобукофф: %i\n\nАминь.", buf,bigb,minb,lstrlen(buf)); MessageBox(hwndDlg,msg ,"Пароль:",MB_ICONINFORMATION); break; case IDCOPUT: SendMessage(hwndDlg,WM_CLOSE,0,0); break; } } break; case WM_CLOSE: if (MessageBox(hwndDlg,"Закрыть?","",MB_YESNO)==IDYES) { EndDialog(hwndDlg,0); } break; } return 0; } void Main() { DialogBox(GetModuleHandle(NULL),(LPCSTR)IDD_DIALOG1,NULL,DlgProc); } |
Автор: Jeno 29.12.06, 17:39 |
Цитата mad_avenger @ <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> void Main() { DialogBox(GetModuleHandle(NULL),(LPCSTR)IDD_DIALOG1,NULL,DlgProc); } вот это и т.п. получается не нужно? з.ы.если я не создаю окно, а загружаю его с РС, знач мне не нужно это? <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> ATOM MyRegisterClass(HINSTANCE hInstance) { WNDCLASSEX wcex; wcex.cbSize = sizeof(WNDCLASSEX); wcex.style = CS_HREDRAW | CS_VREDRAW; wcex.lpfnWndProc = WndProc; wcex.cbClsExtra = 0; wcex.cbWndExtra = 0; wcex.hInstance = hInstance; wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_WINAPI)); wcex.hCursor = LoadCursor(NULL, IDC_ARROW); wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); wcex.lpszMenuName = MAKEINTRESOURCE(IDC_WINAPI); wcex.lpszClassName = szWindowClass; wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL)); return RegisterClassEx(&wcex); } За пример спасибо огромное з.ы.а где такие статьи можно найти? просто все самому приходится узнать....весь мсдн перерыл пока нашел что мне нужно |
Автор: maksa_2000 30.12.06, 19:56 |
на счет постоянной конвертации из широких символов в простые, зачем усложнять себе жизнь и использовать char веть есть же замечательный тип TCHAR. А на счет главного окна, то его тоже можно сделать диалогом и спокойно редактировать через редактор. |