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

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

iktomy

#1
Очень долго я пользовался MFC при написании прог. Ничего не скажу, нормальная штука, как бы там ее не хаяли отдельные товарищи. Но вот захотелось мне роста над собой. И приходится просить совета: какие книги наиболее полно и подробно описывают WinAPI. Я скачал Петзольда, докачиваю Румянцева. У Петзольда (по крайней мере в той книге, что я скачал) все уже порядком устарело. Он под Вынь'95 пишет. А мне нужно под 2к\ХР или 98\Ме. Конечно научиться можно, но стоит ли заниматься такой дурью, как читать одно а кодить совсем другое. Может у Румянцева рулез, посмотрим. Но всетаки посаветуйте и кинте линки. Заранее сенкс.
 

admin

Well-known member
08.08.2003
2 754
0
#2
iktomy
у меня есть по Win API доки и книги.
а так не знаю. вроде из моих знакомых все на .NET перешли и как-то активно не юзают API.
 
I

iktomy

#3
Дык это, скинь плиз на мыло доков: iktomy(dog symbol)tut.by
 
I

iktomy

#4
Здравствуйте господа!
Решил вот поучиться на 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;
}
 
B

bugger

#5
если бы ты давно пользовался MFC, то давно бы уже убедился в том, что в большом количестве случаев классы MFC - это просто обертка над API.
 
G

Guest

#6
Извините, но MFC я пользуюсь действительно давно. А насчет обвертки скажу только то, что слишком уж она шикарная (имеется ввиду размер выходного файла)
 
G

Guest_SeriousMan

#7
Мдя... Твой код вызвал у меня рвотный рефлекс. :)

Твоя трабла в том, что "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);
}
}
 
I

iktomy

#8
Да ладно, я не из обидчивых. Проблему насчет "Main Class"/"MainClass" я уже давно решил, но все равно сенкью. Я нассчет показывать-непоказывать - на то он и форум, что бы помогать начинающим, да и вообще всем.
И все таки хотелось бы услышать от "отцов" - какую литературу почитать? А то все никак и никто.
 
S

SeriousMan

#9
Я изучал WinApi на сайте WASM.RU. Мой совет: сначала выполни упражнения на ассемблере, а уж потом перенеси на C++. Тогда впоследствии намного легче будет.
 
I

iktomy

#10
Ну тут я соглашусь наверное. Буквально вчера взял полистать книжицу Юрова. Да WinAPI в асме даже немного более понятнее. Т.ч. совет дельный - приму как руководство к действию.
 
P
#11
Извините, ничего личного, но фигней вы страдаете - на асме winapi кодить, вы бы еще в машинных кодах писали. Лучше бы потратили больше времени на более интересные вещи. Курсе на первом-втором, я тоже всякой подобной ерундой маялся, о чем жалею. Лучше бы книжки про RUP почитали, куда как более полезнее. IMHO.
 
S

Slayer

#12
Люди помогите как на Visual C++ под консоль очищать экран (cls) и выводить текст цветом :huh:
 
I

iktomy

#14
Вообще то можно было тему свою создать.
Но поскольку я сегодня добрый (послезавтра День Варенья) то привожу цитату (сайт Исходники.ру:
Каждый символ сонсольного приложения имеет свои аттрибуты, и 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 данным методом.
 
G

Guest

#15
Тебе нужно под 2к\ХР или 98\Ме?
Что же тебе такое нужно, если ты не зная АПИ хочешь писать под ХР?
Побщем сначала Петзольд и Рихтер...потом сам поймешь что хорошо, а что плохо...

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