Форум программистов, компьютерный форум, киберфорум
C++: WinAPI
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/3: Рейтинг темы: голосов - 3, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 29.04.2016
Сообщений: 3
1

Не создается окно функцией CreateWindow

29.04.2016, 11:18. Просмотров 596. Ответов 4
Метки нет (Все метки)

Выводит сообщение Cannot create window. Компилятор: VS 2015 Community. Вызывает интерес то, что несколько дней назад данный класс работал в других проектах, и все нормально создавалось.

Файл с WinMain
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include "KWnd.h"
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
 
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    MSG msg;
    KWnd mainWnd(TEXT("Application"), hInstance, nCmdShow, WndProc);
 
    while (GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
 
    return msg.wParam;
}
Класс KWnd
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
class KWnd
{
protected:
    HWND hWnd;
    WNDCLASSEX wc;
public:
    KWnd(LPCTSTR windowName, HINSTANCE hInst, int cmdShow, LRESULT(WINAPI *pWndProc)(HWND, UINT, WPARAM, LPARAM),
        LPCTSTR menuName = NULL, int x = CW_USEDEFAULT, int y = 0, int width = CW_USEDEFAULT, int height = 0,
        UINT classStyle = CS_HREDRAW | CS_VREDRAW, DWORD windowStyle = WS_OVERLAPPEDWINDOW, HWND hParent = NULL) 
    {
        PTSTR szClassName = TEXT("KWndClass");
 
        wc.cbSize = sizeof(wc);
        wc.style = classStyle;
        wc.lpfnWndProc = pWndProc;
        wc.cbClsExtra = 0;
        wc.cbWndExtra = 0;
        wc.hInstance = hInst;
        wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
        wc.hCursor = LoadCursor(NULL, IDC_ARROW);
        wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
        wc.lpszMenuName = menuName;
        wc.lpszClassName = szClassName;
        wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
 
        if (!RegisterClassEx(&wc))
        {
            TCHAR msg[50] = TEXT("Cannot register class: ");
            lstrcat(msg, szClassName);
            MessageBox(NULL, msg, TEXT("Error"), MB_OK);
            exit(0);
        }
 
        hWnd = CreateWindow(szClassName, windowName, windowStyle, x, y, width, height, hParent, (HMENU)NULL, hInst, NULL);
 
        if (!hWnd)
        {
            TCHAR msg[50] = TEXT("Cannot create window: ");
            lstrcat(msg, szClassName);
            MessageBox(NULL, msg, TEXT("Error"), MB_OK);
            exit(0);
        }
 
        ShowWindow(hWnd, cmdShow);
    }
 
    HWND GetHWnd() { return hWnd; }
};
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.04.2016, 11:18
Ответы с готовыми решениями:

Не создается окно CreateWindow
#include <windows.h> #include <stdlib.h> LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);...

Ошибка в CreateWindow: окно не появляется
В коде ошибка - определить какая не могу, но прога компилируется запускается а вот симтом это то...

Функция CreateWindow не создает дочернее окно
Приветствую! Застрял с довольно идиотской проблемой. Необходимо создать приложение с дочерним...

А можно узнать с каким значением второго параметра функции CreateWindow создано окно?
Есть дескриптор. Можно по нему вытянуть эту инфу?

4
67 / 67 / 11
Регистрация: 28.12.2012
Сообщений: 471
29.04.2016, 19:50 2
Что возвращает GetLastError()?
0
0 / 0 / 0
Регистрация: 29.04.2016
Сообщений: 3
29.04.2016, 21:00  [ТС] 3
Пишу вот так, возвращает ноль.

C++
1
2
3
4
5
hWnd = CreateWindow(szClassName, windowName, windowStyle, x, y, width, height, hParent, (HMENU)NULL, hInst, NULL);
    DWORD error = GetLastError();
    char chError[5];
    _itoa_s(error, chError, 10);
    MessageBoxA(NULL, chError, "Error", MB_OK);
0
Ушел с форума
Эксперт С++
16406 / 7381 / 1184
Регистрация: 02.05.2013
Сообщений: 11,637
Записей в блоге: 1
30.04.2016, 00:33 4
А где код WndProc?
0
0 / 0 / 0
Регистрация: 29.04.2016
Сообщений: 3
30.04.2016, 16:24  [ТС] 5
Программа должна создавать растровое изображение и сохранять его на жестком диске.

WndProc
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
KDib bmp;
LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    HDC hDC;
    PAINTSTRUCT ps;
    TEXTMETRIC tm;
    SIZE size;
    static int width, height;
    COLORREF color;
    int x, y;
    BOOL isFileCreated;
    static char line[2];
    const char ANSI = 65;
 
    switch (uMsg)
    {
    case WM_CREATE:
        hDC = GetDC(hWnd);
        GetTextMetrics(hDC, &tm);
        line[0] = ANSI;
        line[1] = '\0';
        GetTextExtentPoint32A(hDC, line, 1, &size); //Определение ширины строки line в битах
        width = size.cx;
        height = tm.tmHeight;
 
        isFileCreated = bmp.CreateDIB24(width, height, "New BMP");
        if (!isFileCreated)
            MessageBox(hWnd, TEXT("Cannot create BMP file"), TEXT("Error"), MB_OK);
 
        ReleaseDC(hWnd, hDC);
        break;
 
    case WM_PAINT:
        hDC = BeginPaint(hWnd, &ps);
        SetBkColor(hDC, RGB(0, 0, 0));
        SetTextColor(hDC, RGB(255, 255, 255));
        TextOutA(hDC, 0, 0, line, 1);
 
        for (y = 0; y < height; ++y)            //С нижней строки проход по пикселам
            for (x = 0; x < width; ++x) 
            {
                color = GetPixel(hDC, x, height - 1 - y);
                bmp.SetPixel(x, y, color);
            }
 
        bmp.WriteDIB24();
        EndPaint(hWnd, &ps);
        break;
 
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
 
    default: DefWindowProc(hWnd, uMsg, wParam, lParam);
    }
 
    return 0;
}


KDib.h
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include <windows.h>
#include <fstream>
#include <string>
using namespace std;
 
 
class KDib 
{
private:
    int width;                    //Ширина растрового файла
    int height;                   //Высота
    int bytesPerLine;             //Число байтов в одной строке
    
    BITMAPFILEHEADER fileHead;    //Заголовок растрового файла
    BITMAPINFOHEADER infoHead;    //Заголовок информационного блока
    BITMAPINFOHEADER* pInfoHead;
    BYTE* aBitmapBits;            //Массив пикселов
    int imageSize;                //Размер картинки в битах
 
    int fileHeadSize = sizeof(BITMAPFILEHEADER);
    int infoHeadSize = sizeof(BITMAPINFOHEADER);
    
    string error;
    ifstream inpFile;
    ofstream outFile;
public:
    KDib();
    ~KDib();
 
    BOOL CreateDIB24(int w, int h, const char* fileName);  //Создание BMP файла
    void WriteDIB24();                                     //Запись файла на диск
    BOOL LoadFromFile(const char* fileName);               //Загрузка картинки из файла
 
    void SetPixel(int x, int y, COLORREF color);   //Установка пиксела в массив
 
    int Draw(HDC hdc, int xDst, int yDst, int wDst, int hDst,
             int xSrc, int ySrc, int wSrc, int hSrc, DWORD rop);  //Рисование растрового изображения на экране
 
    int GetWidth() { return width; }
    int GetHeight() { return height; }
    const char* GetError() { return error.c_str(); }
};


KDib.cpp
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
#include "KDib.h"
 
KDib::KDib()
{
    fileHead.bfType = 0x4d32;
    aBitmapBits = NULL;
}
 
KDib::~KDib()
{
    if (aBitmapBits) delete[] aBitmapBits;
    if (pInfoHead) delete[] pInfoHead;
    if (outFile) outFile.close();
}
 
BOOL KDib::CreateDIB24(int w, int h, const char* fileName)
{
    width = w;
    height = h;
    bytesPerLine = ((width * 24 + 31) / 32) * 4;
    imageSize = bytesPerLine * height;
 
    fileHead.bfSize = fileHeadSize + infoHeadSize + imageSize; //Размер файла
    fileHead.bfOffBits = fileHeadSize + infoHeadSize;          //Отступ битов до картинки 
    
    infoHead.biSize = infoHeadSize;      //Заполнение информационного блока
    infoHead.biWidth = width;
    infoHead.biHeight = height;
    infoHead.biPlanes = 1;
    infoHead.biBitCount = 24;            //Битов на пиксел
    infoHead.biCompression = BI_RGB;
    infoHead.biSizeImage = imageSize;
 
    aBitmapBits = new BYTE[imageSize];  //Создание массива пикселов
    memset(aBitmapBits, 0, imageSize);  //Заполнение массива пикселов нулями
 
    outFile.open(fileName, ios::out | ios::binary | ios::trunc); //Открытие файла на запись
    if (!outFile) 
        return FALSE;
    else 
        return TRUE;
}
 
void KDib::WriteDIB24()
{
    // Запись заголовка BMP файла
    outFile.write((char*)&fileHead, fileHeadSize);
    outFile.write((char*)&infoHead, infoHeadSize);
    // Запись картинки
    outFile.write((char*)aBitmapBits, imageSize);
}
 
BOOL KDib::LoadFromFile(const char * fileName)
{
    inpFile.open(fileName, ios::in | ios::binary); //Открываем файл
    if (!inpFile)
    {
        error = "Cannot open the file";
        return FALSE;
    }
 
    inpFile.read((char*)&fileHead, fileHeadSize); //Читаем с файла заголовок
    if (fileHead.bfType != 0x4d32)
    {
        error = "File is not a BMP";
        return FALSE;
    }
 
    infoHeadSize = fileHead.bfOffBits - fileHeadSize;
    imageSize = fileHead.bfSize - (fileHeadSize + infoHeadSize);
    pInfoHead = (BITMAPINFOHEADER*)(new BYTE[infoHeadSize]);
 
    inpFile.read((char*)pInfoHead, infoHeadSize); //Читаем с файла информационный блок
    width = pInfoHead->biWidth;
    height = pInfoHead->biHeight;
 
    aBitmapBits = new BYTE[imageSize];
    inpFile.read((char*)aBitmapBits, imageSize); //Читаем с файла картинку
 
    return TRUE;
}
 
void KDib::SetPixel(int x, int y, COLORREF color)
{
    aBitmapBits[y*bytesPerLine + 3*x] = GetBValue(color);
    aBitmapBits[y*bytesPerLine + 3*x + 1] = GetGValue(color);
    aBitmapBits[y*bytesPerLine + 3*x + 2] = GetRValue(color);
}
 
int KDib::Draw(HDC hdc, int xDst, int yDst, int wDst, int hDst, int xSrc, int ySrc, int wSrc, int hSrc, DWORD rop)
{
    return StretchDIBits(hdc, xDst, yDst, wDst, hDst, xSrc, ySrc, wSrc, hSrc,
                         aBitmapBits, (CONST BITMAPINFO*)pInfoHead, DIB_RGB_COLORS, rop);
}
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
30.04.2016, 16:24

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Создается окно и тут же закрывается. Как заставить окно оставаться рабочим открытым?
Как заставить окно оставаться рабочим открытым? Скопировал с одного исходника код (с++ WinApi) для...

В SDL2 мне нужно создать окно и туда вставить предметы, но только создается окно а предметы не додаются
И я не знаю что не так. Взял код с туториала. Нужна ваша помощь Мой код:#include &quot;pch.h&quot;...

Использование диалогового окна, которое создается функцией uigetfile
Подскажите, пожалуйста, как с использование диалогового окна, которое создается функцией uigetfile...

Не создается окно
вот регистрация класса окна WNDCLASSEX wc = { sizeof( WNDCLASSEX ), CS_CLASSDC,...

Не создаётся окно!
В visual studio лезут ошибки :cry: вот как проходила сборка: 1&gt;------ Сборка начата: проект:...

Не создаётся окно
Добрый день, подскажите пожалуйста, почему не создаётся окно: hwndChildForm =...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.