Хочу учиться!!!

  • Автор темы Автор темы iktomy
  • Дата начала Дата начала
Статус
Закрыто для дальнейших ответов.
I

iktomy

Очень долго я пользовался MFC при написании прог. Ничего не скажу, нормальная штука, как бы там ее не хаяли отдельные товарищи. Но вот захотелось мне роста над собой. И приходится просить совета: какие книги наиболее полно и подробно описывают WinAPI. Я скачал Петзольда, докачиваю Румянцева. У Петзольда (по крайней мере в той книге, что я скачал) все уже порядком устарело. Он под Вынь'95 пишет. А мне нужно под 2к\ХР или 98\Ме. Конечно научиться можно, но стоит ли заниматься такой дурью, как читать одно а кодить совсем другое. Может у Румянцева рулез, посмотрим. Но всетаки посаветуйте и кинте линки. Заранее сенкс.
 
iktomy
у меня есть по Win API доки и книги.
а так не знаю. вроде из моих знакомых все на .NET перешли и как-то активно не юзают API.
 
Дык это, скинь плиз на мыло доков: iktomy(dog symbol)tut.by
 
Здравствуйте господа!
Решил вот поучиться на WinAPI писать, накачал умных статей и книг и облом в первой же программе. Вроде все как надо, но окно не создается. Выскакивает сообщение об ошибке (хоть это работает :) ). Ниже привожу исходник и прошу помощи и дельных советов.
З.Ы. Товарищей, которые поспешат сказать лишь то, какой я тупой и т.п. прошу не откликаться.

#include <windows.h>

LRESULT CALLBACK WindowProc(HWND hWnd, UINT wMsg,
WPARAM wParam, LPARAM lParam);

HINSTANCE hinst;
HWND hwndMain;

LRESULT CALLBACK WindowProc(HWND hWnd,
UINT wMsg,
WPARAM wParam,
LPARAM lParam)
{
switch( wMsg )
{
case WM_KEYDOWN:
{
switch( wParam )
{
case VK_ESCAPE:
PostQuitMessage(0);
break;
}
}
break;

case WM_CLOSE:
{
PostQuitMessage(0);
}

case WM_DESTROY:
{
PostQuitMessage(0);
}
break;

default:
{
return DefWindowProc( hWnd, wMsg, wParam, lParam );
}
break;
}

return 0;
}

int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nShowCmd)
{
MSG msg;
long bRet;
WNDCLASSEX wc;
UNREFERENCED_PARAMETER(lpCmdLine);

if (!hPrevInstance)
{
wc.cbSize = sizeof(WNDCLASSEX);
wc.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC | CS_DBLCLKS;
wc.lpfnWndProc = WindowProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon((HINSTANCE) NULL, IDI_APPLICATION);
wc.hCursor = LoadCursor((HINSTANCE) NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
wc.lpszMenuName = NULL;
wc.lpszClassName = "MainClass";
wc.hIconSm = LoadIcon (NULL, IDI_APPLICATION);

if (!RegisterClassEx(&wc)) return FALSE;
}

hinst = hInstance;
hwndMain = CreateWindow("Main Class", "Test",
WS_OVERLAPPEDWINDOW | WS_VISIBLE,
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0,
0, 0, hinst, 0);
if(!hwndMain)
{
MessageBox(0, "Error создания окна!", "Мазафака...", MB_OK);
return 0;
}

ShowWindow(hwndMain, nShowCmd);
UpdateWindow(hwndMain);

while ((bRet = GetMessage(&msg, (HWND) NULL,0,0)) != 0 && bRet != -1)
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}

UnregisterClass( "MainClass", wc.hInstance );
return (int) msg.wParam;
}
 
если бы ты давно пользовался MFC, то давно бы уже убедился в том, что в большом количестве случаев классы MFC - это просто обертка над API.
 
Извините, но MFC я пользуюсь действительно давно. А насчет обвертки скажу только то, что слишком уж она шикарная (имеется ввиду размер выходного файла)
 
Мдя... Твой код вызвал у меня рвотный рефлекс. :)

Твоя трабла в том, что "MainClass" и "Main Class" - это разные имена.

И вообще, извини, конечно, за грубость, но с ТАКИМ кривым кодом тебе никакая более-менее оплачиваемая работа не светит.

Вот это ещё более-менее, хотя тоже есть масса недостатков, но то, что я увидел сейчас, вообще не следовало показывать.

Код:
#include <windows.h>

HWND hwnd=NULL;
HINSTANCE	hInstance;
BOOL done=FALSE;

LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM);

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
MSG msg;
WNDCLASS wc;

hInstance=GetModuleHandle(NULL);
wc.style=CS_HREDRAW | CS_VREDRAW | CS_OWNDC;
wc.lpfnWndProc=(WNDPROC) WndProc;
wc.cbClsExtra=0;
wc.cbWndExtra=0;
wc.hInstance=hInstance;
wc.hIcon=LoadIcon(NULL, IDI_WINLOGO);
wc.hCursor=LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground=(HBRUSH)(COLOR_WINDOW+1);
wc.lpszMenuName=NULL;
wc.lpszClassName="Class";

RegisterClass(&wc);

hwnd=CreateWindowEx
(WS_EX_APPWINDOW | WS_EX_WINDOWEDGE,
"Class",
"Программа", 
WS_OVERLAPPEDWINDOW | WS_CLIPSIBLINGS | WS_CLIPCHILDREN,
CW_USEDEFAULT, CW_USEDEFAULT,
CW_USEDEFAULT, CW_USEDEFAULT,
NULL, NULL,
hInstance,
NULL);

ShowWindow(hwnd,SW_SHOW);

while(!done)
{
GetMessage(&msg, hwnd, 0, 0);
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}

LRESULT CALLBACK WndProc (HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
case WM_CLOSE:
if(MessageBox(hWnd, "Завершить работу программы?", "Выйти?", MB_YESNO)==IDNO)
 break;
case WM_DESTROY:
PostQuitMessage(0);
done=TRUE;
break;
default:
return DefWindowProc(hWnd,uMsg,wParam,lParam);
}
}
 
Да ладно, я не из обидчивых. Проблему насчет "Main Class"/"MainClass" я уже давно решил, но все равно сенкью. Я нассчет показывать-непоказывать - на то он и форум, что бы помогать начинающим, да и вообще всем.
И все таки хотелось бы услышать от "отцов" - какую литературу почитать? А то все никак и никто.
 
Я изучал WinApi на сайте WASM.RU. Мой совет: сначала выполни упражнения на ассемблере, а уж потом перенеси на C++. Тогда впоследствии намного легче будет.
 
Ну тут я соглашусь наверное. Буквально вчера взял полистать книжицу Юрова. Да WinAPI в асме даже немного более понятнее. Т.ч. совет дельный - приму как руководство к действию.
 
Извините, ничего личного, но фигней вы страдаете - на асме winapi кодить, вы бы еще в машинных кодах писали. Лучше бы потратили больше времени на более интересные вещи. Курсе на первом-втором, я тоже всякой подобной ерундой маялся, о чем жалею. Лучше бы книжки про RUP почитали, куда как более полезнее. IMHO.
 
Люди помогите как на Visual C++ под консоль очищать экран (cls) и выводить текст цветом :huh:
 
Вообще то можно было тему свою создать.
Но поскольку я сегодня добрый (послезавтра День Варенья) то привожу цитату (сайт Исходники.ру:
Каждый символ сонсольного приложения имеет свои аттрибуты, и Win32 консольные функции могут работать с аттрибутами двумя способами. SetConsoleTextAttribute() работает с символами, записанными в буфере, в то время как FillConsoleOutputAttribute() напрямую изменяет атрибуты символов.

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

void CMyConsoleClass::SetTextNormal()
{
// белым на чёрном - по умолчанию
SetConsoleTextAttribute ( m_hConsole,
FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE );
}

void CMyConsoleClass::SetTextBold()
{
// ярко-белым на чёрном
SetConsoleTextAttribute ( m_hConsole,
FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE |
FOREGROUND_INTENSITY );
}

void CMyConsoleClass::SetTextReverse()
{
// чёрным на белом
SetConsoleTextAttribute ( m_hConsole,
BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE );
}

Обратите внимание, что нет никаких установок для мерцания и подчёркивания, так что Вам прийдётся проявить немного изобратательности, если Вы хотите полностью съэмулировать текстовые режимы ANSI или VT100 данным методом.
 
Тебе нужно под 2к\ХР или 98\Ме?
Что же тебе такое нужно, если ты не зная АПИ хочешь писать под ХР?
Побщем сначала Петзольд и Рихтер...потом сам поймешь что хорошо, а что плохо...

Глупо честно говоря писать на МФЦ не имея представления об АПИ...
 
Статус
Закрыто для дальнейших ответов.
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!