Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.06.2012, 21:31   #21
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,322
По умолчанию

Урок 25. Простой битмэп --> http://wasm.ru/article.php?article=1001025

main.c
Код:
#include <windows.h>
#include <tchar.h>

LRESULT CALLBACK WindowProc( HWND hwnd,
                             UINT uMsg,
                             WPARAM wParam,
                             LPARAM lParam
                           );

LPCTSTR ClassName = _T("SimpleWin32_C_BitmapClass");
LPCTSTR AppName = _T("Win32_C Simple Bitmap Example");

HINSTANCE hInstance;

int WINAPI _tWinMain( HINSTANCE hInst,
                      HINSTANCE hPrevInstance,
                      LPTSTR lpCmdLine,
                      int nCmdShow
                    )
{
    WNDCLASSEX wc;
    MSG msg;
    HWND hwnd;

    wc.cbSize = sizeof(WNDCLASSEX);
    wc.style = CS_HREDRAW | CS_VREDRAW;
    wc.lpfnWndProc = WindowProc;
    wc.cbClsExtra = 0;
    wc.cbWndExtra = 0;
    hInstance = hInst;
    wc.hInstance = hInstance;
    wc.hIcon = LoadIcon((HINSTANCE) NULL, IDI_APPLICATION);
    wc.hCursor = LoadCursor((HINSTANCE) NULL, IDC_ARROW);
    wc.hbrBackground = (HBRUSH) (COLOR_WINDOW+1);
    wc.lpszMenuName = NULL;
    wc.lpszClassName = ClassName;
    wc.hIconSm = LoadIcon((HINSTANCE) NULL, IDI_APPLICATION);

    if (RegisterClassEx(&wc) == 0) {
        MessageBox(NULL, _T("Cannot regiser window class"), _T("Error"), MB_ICONERROR);
        return FALSE;
    }

    hwnd = CreateWindowEx(NULL,
                          ClassName,
                          AppName,
                          WS_OVERLAPPEDWINDOW,
                          CW_USEDEFAULT,
                          CW_USEDEFAULT,
                          300,
                          315,
                          (HWND) NULL,
                          (HMENU) NULL,
                          hInstance,
                          NULL);

    if (hwnd == NULL) {
        MessageBox(NULL, _T("Cannot create window"), _T("Error"), MB_ICONERROR);
        return FALSE;
    }

    ShowWindow(hwnd, SW_SHOWNORMAL);
    UpdateWindow(hwnd);

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

    return msg.wParam;
}

#define IDB_MAIN 1

HBITMAP hBitmap;

LRESULT CALLBACK WindowProc( HWND hWnd,
                             UINT uMsg,
                             WPARAM wParam,
                             LPARAM lParam
                           )
{
    PAINTSTRUCT ps;
    HDC hdc;
    HDC hMemDC;
    RECT rect;

    switch(uMsg) {
    case WM_CREATE:
        hBitmap = LoadBitmap(hInstance, MAKEINTRESOURCE(IDB_MAIN));
        break;
    case WM_PAINT:
        hdc = BeginPaint(hWnd, &ps);
        hMemDC = CreateCompatibleDC(hdc);
        SelectObject(hMemDC, hBitmap);
        GetClientRect(hWnd, &rect);
        BitBlt(hdc, 0, 0, rect.right, rect.bottom, hMemDC, 0, 0, SRCCOPY);
        DeleteDC(hMemDC);
        EndPaint(hWnd, &ps);
        break;
    case WM_DESTROY:
        DeleteObject(hBitmap);
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hWnd, uMsg, wParam, lParam);
    }

    return 0;
}

Последний раз редактировалось 8Observer8; 04.06.2012 в 11:40. Причина: добавил "DeleteObject(hBitmap);", заменил "COLOR_APPWORKSPACE" на "COLOR_WINDOW+1"
8Observer8 вне форума Ответить с цитированием
Старый 04.06.2012, 14:06   #22
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,322
По умолчанию

Урок 26. Сплэш-экран --> http://wasm.ru/article.php?article=1001026

main.c
Код:
#include <windows.h>
#include <tchar.h>

LRESULT CALLBACK WindowProc( HWND hwnd,
                             UINT uMsg,
                             WPARAM wParam,
                             LPARAM lParam
                           );

LPCTSTR ClassName = _T("SplashDemoWinClass");
LPCTSTR AppName = _T("Splash Screen Example");
LPCTSTR Libname = _T("splash.dll");

int WINAPI _tWinMain( HINSTANCE hInstance,
                      HINSTANCE hPrevInstance,
                      LPTSTR lpCmdLine,
                      int nCmdShow
                    )
{
    WNDCLASSEX wc;
    MSG msg;
    HWND hwnd;

    wc.cbSize = sizeof(WNDCLASSEX);
    wc.style = CS_HREDRAW | CS_VREDRAW;
    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) (COLOR_WINDOW+1);
    wc.lpszMenuName = NULL;
    wc.lpszClassName = ClassName;
    wc.hIconSm = LoadIcon((HINSTANCE) NULL, IDI_APPLICATION);

    if (RegisterClassEx(&wc) == 0) {
        MessageBox(NULL, _T("Cannot regiser window class"), _T("Error"), MB_ICONERROR);
        return FALSE;
    }

    hwnd = CreateWindowEx((DWORD) NULL,
                          ClassName,
                          AppName,
                          WS_OVERLAPPEDWINDOW,
                          CW_USEDEFAULT,
                          CW_USEDEFAULT,
                          CW_USEDEFAULT,
                          CW_USEDEFAULT,
                          (HWND) NULL,
                          (HMENU) NULL,
                          hInstance,
                          NULL);

    if (hwnd == NULL) {
        MessageBox(NULL, _T("Cannot create window"), _T("Error"), MB_ICONERROR);
        return FALSE;
    }

    ShowWindow(hwnd, SW_SHOWNORMAL);
    UpdateWindow(hwnd);

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

    return msg.wParam;
}

#define IDB_MAIN 1

HBITMAP hBitMap;

LRESULT CALLBACK WindowProc( HWND hWnd,
                             UINT uMsg,
                             WPARAM wParam,
                             LPARAM lParam
                           )
{
    HMODULE hLibr;

    switch(uMsg) {
    case WM_CREATE:
        hLibr = LoadLibrary(Libname);
        if (hLibr != NULL) {
            FreeLibrary(hLibr);
        }
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hWnd, uMsg, wParam, lParam);
    }

    return 0;
}
splash.dll
Код:
#include <windows.h>
#include <tchar.h>

LRESULT CALLBACK WindowProc( HWND hwnd,
                             UINT uMsg,
                             WPARAM wParam,
                             LPARAM lParam
                           );
void ShowBitMap(void);

LPCTSTR ClassName = _T("SplashWndClass");

HINSTANCE hInstance;

BOOL APIENTRY DllMain( HINSTANCE hInst,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
{
    switch (ul_reason_for_call) {
    case DLL_PROCESS_ATTACH:
        hInstance = hInst;
        ShowBitMap();
        break;
    }

    return TRUE;
}

void ShowBitMap(void)
{
    WNDCLASSEX wc;
    MSG msg;
    HWND hwnd;

    wc.cbSize = sizeof(WNDCLASSEX);
    wc.style = CS_HREDRAW | CS_VREDRAW;
    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) (COLOR_WINDOW+1);
    wc.lpszMenuName = NULL;
    wc.lpszClassName = ClassName;
    wc.hIconSm = NULL;

    if (RegisterClassEx(&wc) == 0) {
        MessageBox(NULL, _T("Cannot regiser window class"), _T("Error"), MB_ICONERROR);
        return;
    }

    hwnd = CreateWindowEx((DWORD) NULL,
                          ClassName,
                          NULL,
                          WS_POPUP,
                          CW_USEDEFAULT,
                          CW_USEDEFAULT,
                          250,
                          250,
                          (HWND) NULL,
                          (HMENU) NULL,
                          hInstance,
                          NULL);

    if (hwnd == NULL) {
        MessageBox(NULL, _T("Cannot create window"), _T("Error"), MB_ICONERROR);
        return;
    }

    ShowWindow(hwnd, SW_SHOWNORMAL);
    UpdateWindow(hwnd);

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

    return;
}
8Observer8 вне форума Ответить с цитированием
Старый 04.06.2012, 14:07   #23
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,322
По умолчанию

splash.dll (продолжение)
Код:

LPCTSTR BitmapName = _T("MySplashBMP");

HBITMAP hBitMap;
UINT_PTR TimerID;

LRESULT CALLBACK WindowProc( HWND hWnd,
                             UINT uMsg,
                             WPARAM wParam,
                             LPARAM lParam
                           )
{
    PAINTSTRUCT ps;
    HDC hdc;
    HDC hMemoryDC;
    HGDIOBJ hOldBmp;
    BITMAP bitmap;
    DWORD DlgHeight;
    DWORD DlgWidth;
    RECT DlgRect;
    RECT DesktopRect;

    switch(uMsg) {
    case WM_DESTROY:
        if (hBitMap != 0) {
            DeleteObject(hBitMap);
        }
        PostQuitMessage(0);
        break;
    case WM_CREATE:
        GetWindowRect(hWnd, &DlgRect);
        GetWindowRect(GetDesktopWindow(), &DesktopRect);
        DlgHeight = DlgRect.bottom - DlgRect.top;
        DlgWidth = DlgRect.right - DlgRect.left;
        MoveWindow(hWnd, (DesktopRect.right-DlgWidth)/2,
            (DesktopRect.bottom-DlgHeight)/2,DlgWidth, DlgHeight, 0);
        hBitMap = LoadBitmap(hInstance, BitmapName);
        TimerID = SetTimer(hWnd, 1, 2000, NULL);
        break;
    case WM_TIMER:
        SendMessage(hWnd, WM_LBUTTONDOWN, (WPARAM) NULL, (LPARAM) NULL);
        KillTimer(hWnd, TimerID);
        break;
    case WM_PAINT:
        hdc = BeginPaint(hWnd, &ps);
        hMemoryDC = CreateCompatibleDC(hdc);
        hOldBmp = SelectObject(hMemoryDC, hBitMap);
        GetObject(hBitMap, sizeof(BITMAP), &bitmap);
        StretchBlt(hdc, 0, 0, 250, 250, hMemoryDC, 0, 0, bitmap.bmWidth,
                   bitmap.bmHeight, SRCCOPY);
        SelectObject(hMemoryDC, hOldBmp);
        DeleteDC(hMemoryDC);
        EndPaint(hWnd, &ps);
        break;
    case WM_LBUTTONDOWN:
        DestroyWindow(hWnd);
    default:
        return DefWindowProc(hWnd, uMsg, wParam, lParam);
    }

    return 0;
}
8Observer8 вне форума Ответить с цитированием
Старый 06.06.2012, 20:21   #24
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,322
По умолчанию

Урок 32. MDI-интерфейс --> http://wasm.ru/article.php?article=1001032

main.c
Код:
#include <windows.h>
#include <tchar.h>

#define IDR_MAINMENU     101
#define IDR_CHILDMENU    102

LRESULT CALLBACK WindowProc( HWND hwnd,
                             UINT uMsg,
                             WPARAM wParam,
                             LPARAM lParam
                           );

LRESULT CALLBACK ChildProc( HWND hwnd,
                            UINT uMsg,
                            WPARAM wParam,
                            LPARAM lParam
                          );

LPCTSTR ClassName = _T("MDIASMClass");
LPCTSTR MDIChildClassName = _T("Win32asmMDIChild");
LPCTSTR AppName = _T("Win32asm MDI Demo");

HINSTANCE hInstance;
HMENU hMainMenu;
HWND hwndClient;
HMENU hChildMenu;
MDICREATESTRUCT mdicreate;
HWND hwndFrame;

int WINAPI _tWinMain( HINSTANCE hInst,
                      HINSTANCE hPrevInstance,
                      LPTSTR lpCmdLine,
                      int nCmdShow
                    )
{
    WNDCLASSEX wc;
    MSG msg;

	//=============================================
	// Register the frame window class
	//=============================================
    wc.cbSize = sizeof(WNDCLASSEX);
    wc.style = CS_HREDRAW | CS_VREDRAW;
    wc.lpfnWndProc = WindowProc;
    wc.cbClsExtra = 0;
    wc.cbWndExtra = 0;
    hInstance = hInst;
    wc.hInstance = hInstance;
    wc.hIcon = LoadIcon((HINSTANCE) NULL, IDI_APPLICATION);
    wc.hCursor = LoadCursor((HINSTANCE) NULL, IDC_ARROW);
    wc.hbrBackground = (HBRUSH) (COLOR_APPWORKSPACE);
    wc.lpszMenuName = MAKEINTRESOURCE(IDR_MAINMENU);
    wc.lpszClassName = ClassName;
    wc.hIconSm = LoadIcon((HINSTANCE) NULL, IDI_APPLICATION);

    if (RegisterClassEx(&wc) == 0) {
        MessageBox(NULL, _T("Cannot regiser window class"), _T("Error"), MB_ICONERROR);
        return FALSE;
    }

    //================================================
    // Register the MDI child window class
    //================================================
    wc.lpfnWndProc = ChildProc;
    wc.hbrBackground = (HBRUSH) (COLOR_WINDOW+1);
    wc.lpszClassName = MDIChildClassName;

    if (RegisterClassEx(&wc) == 0) {
        MessageBox(NULL, _T("Cannot regiser window class"), _T("Error"), MB_ICONERROR);
        return FALSE;
    }

    hwndFrame = CreateWindowEx((DWORD) NULL,
                               ClassName,
                               AppName,
                               WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN,
                               CW_USEDEFAULT,
                               CW_USEDEFAULT,
                               500,
                               300,
                               (HWND) NULL,
                               (HMENU) NULL,
                               hInstance,
                               NULL);

    if (hwndFrame == NULL) {
        MessageBox(NULL, _T("Cannot create window"), _T("Error"), MB_ICONERROR);
        return FALSE;
    }

    hChildMenu = LoadMenu(hInstance, MAKEINTRESOURCE(IDR_CHILDMENU));

    ShowWindow(hwndFrame, SW_SHOWNORMAL);
    UpdateWindow(hwndFrame);

    while(GetMessage(&msg, NULL, 0, 0) != 0) {
        if (TranslateMDISysAccel(hwndClient, &msg) == 0) {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    }

    return msg.wParam;
}

#define IDM_EXIT         40001
#define IDM_TILEHORZ     40002
#define IDM_TILEVERT     40003
#define IDM_CASCADE      40004
#define IDM_NEW          40005
#define IDM_CLOSE        40006

LPCTSTR MDIClientName = _T("MDICLIENT");
LPCTSTR MDIChildTitle = _T("MDI Child");

LRESULT CALLBACK WindowProc( HWND hWnd,
                             UINT uMsg,
                             WPARAM wParam,
                             LPARAM lParam
                           )
{
    CLIENTCREATESTRUCT ClientStruct;
    HWND hActiveWnd;

    switch(uMsg) {
    case WM_CREATE:
        hMainMenu = GetMenu(hWnd);
        ClientStruct.hWindowMenu = GetSubMenu(hMainMenu, 1);
        ClientStruct.idFirstChild = 100;
        hwndClient = CreateWindowEx((DWORD) NULL,
                                    MDIClientName,
                                    NULL,
                                    WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN,
                                    CW_USEDEFAULT,
                                    CW_USEDEFAULT,
                                    CW_USEDEFAULT,
                                    CW_USEDEFAULT,
                                    hWnd,
                                    (HMENU) NULL,
                                    hInstance,
                                    &ClientStruct);
8Observer8 вне форума Ответить с цитированием
Старый 06.06.2012, 20:24   #25
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,322
По умолчанию

main.c (продолжение)

Код:
        //=======================================
        // Initialize the MDICREATESTRUCT
        //=======================================
        mdicreate.szClass = MDIChildClassName;
        mdicreate.szTitle = MDIChildTitle;
        mdicreate.hOwner = hInstance;
        mdicreate.x = CW_USEDEFAULT;
        mdicreate.y = CW_USEDEFAULT;
        mdicreate.cx = CW_USEDEFAULT;
        mdicreate.cy = CW_USEDEFAULT;
        break;
    case WM_COMMAND:
        if (lParam == 0) {
            if (LOWORD(wParam) == IDM_EXIT) {
                SendMessage(hWnd, WM_CLOSE, (WPARAM) 0, (LPARAM) 0);
            }
            else if (LOWORD(wParam) == IDM_TILEHORZ) {
                SendMessage(hwndClient, WM_MDITILE, (WPARAM) MDITILE_HORIZONTAL,
                           (LPARAM) 0);
            }
            else if (LOWORD(wParam) == IDM_TILEVERT) {
                SendMessage(hwndClient, WM_MDITILE, (WPARAM) MDITILE_VERTICAL,
                           (LPARAM) 0);
            }
            else if (LOWORD(wParam) == IDM_CASCADE) {
                SendMessage(hwndClient, WM_MDICASCADE, (WPARAM) MDITILE_SKIPDISABLED,
                           (LPARAM) 0);
            }
            else if (LOWORD(wParam) == IDM_NEW) {
                SendMessage(hwndClient, WM_MDICREATE, (WPARAM) 0, (LPARAM) &mdicreate);
            }
            else if (LOWORD(wParam) == IDM_CLOSE) {
                hActiveWnd = SendMessage(hwndClient, WM_MDIGETACTIVE, (WPARAM) 0,
                                        (LPARAM) 0);
                SendMessage(hActiveWnd, WM_CLOSE, (WPARAM) 0, (LPARAM) 0);
            }
            else {
                DefFrameProc(hWnd, hwndClient, uMsg, wParam, lParam);
            }
        }
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefFrameProc(hWnd, hwndClient, uMsg, wParam, lParam);
    }

    return 0;
}

LPCTSTR ClosePromptMessage  = _T("Are you sure you want to close this window?");

LRESULT CALLBACK ChildProc( HWND hChild,
                            UINT uMsg,
                            WPARAM wParam,
                            LPARAM lParam)
{
    int menu_item_val;

    switch(uMsg) {
    case WM_MDIACTIVATE:
        if (lParam == hChild) {
            SendMessage(hwndClient, WM_MDISETMENU, (WPARAM) hChildMenu,
                       (LPARAM) GetSubMenu(hChildMenu, 1));
        }
        else {
            SendMessage(hwndClient, WM_MDISETMENU, (WPARAM) hChildMenu,
                       (LPARAM) GetSubMenu(hMainMenu, 1));
        }
        DrawMenuBar(hwndFrame);
        break;
    case WM_CLOSE:
        menu_item_val = MessageBox(hChild, ClosePromptMessage, AppName, MB_YESNO);
        if (menu_item_val == IDYES) {
            SendMessage(hwndClient, WM_MDIDESTROY, (WPARAM) hChild, (LPARAM) 0);
        }
        break;
    default:
        return DefMDIChildProc(hChild, uMsg, wParam, lParam);
    }

    return 0;
}
mdi.rc
Код:
#define IDR_MAINMENU     101
#define IDR_CHILDMENU    102
#define IDM_EXIT         40001
#define IDM_TILEHORZ     40002
#define IDM_TILEVERT     40003
#define IDM_CASCADE      40004
#define IDM_NEW          40005
#define IDM_CLOSE        40006

IDR_MAINMENU MENU DISCARDABLE 
BEGIN
    POPUP "&File"
    BEGIN
        MENUITEM "&New", IDM_NEW
        MENUITEM "E&xit", IDM_EXIT
    END
    POPUP "&Window"    
    BEGIN
    	MENUITEM "Tile Horizontal", IDM_TILEHORZ
    	MENUITEM "Tile Vertical", IDM_TILEVERT
    	MENUITEM "Cascade", IDM_CASCADE
    END
END

IDR_CHILDMENU MENU DISCARDABLE 
BEGIN
    POPUP "&File (child)"
    BEGIN
        MENUITEM "&New", IDM_NEW
        MENUITEM "&Close", IDM_CLOSE
        MENUITEM "E&xit", IDM_EXIT
    END
    POPUP "&Window (child)"    
    BEGIN
    	MENUITEM "Tile Horizontal", IDM_TILEHORZ
    	MENUITEM "Tile Vertical", IDM_TILEVERT
    	MENUITEM "Cascade", IDM_CASCADE
    END
END


P.S. В примере Iczelion'а в файле "mdi.rc" подключался файла "resource.h", но он не нужен.

Последний раз редактировалось 8Observer8; 06.06.2012 в 20:35.
8Observer8 вне форума Ответить с цитированием
Старый 15.09.2012, 16:28   #26
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,322
По умолчанию

Предварительное содержание:

● Урок 9. Дочерние окна:
- Часть 1
- Часть 2
● Урок 10. Диалоговое окно как основное (первый пример):
- Часть 1
- Часть 2
Урок 10. Диалоговое окно как основное (второй пример)
Урок 14. Процесс
Урок 15. Треды (ветви)
Урок 16. Объект события
Урок 17. Динамические библиотеки
Урок 18. Common Control'ы
Урок 20. Сабклассинг окна
Урок 23. Иконка в system tray
Урок 25. Простой битмэп
● Урок 26. Сплэш-экран:
- Часть 1
- Часть 2
● Урок 32. MDI-интерфейс:
- Часть 1
- Часть 2

Последний раз редактировалось 8Observer8; 15.09.2012 в 16:33.
8Observer8 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Win32 API Tymchuk C++ Builder 0 16.05.2012 21:53
win32 API.Visual Studio 2008.Создание проекта Win32 Aleksandr_Yanov Visual C++ 2 12.09.2010 13:09
Win32 API. VS2008. Как создать приложение win32 в vs2008? Aleksandr_Yanov Visual C++ 4 12.09.2010 00:59
Win32 Api revaldo666 Win Api 10 06.07.2010 00:48
Win32 Api! alexov Общие вопросы C/C++ 7 09.02.2009 22:25