Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [C++ WinAPI]при создании кнопок теряется дескриптор окна 
:(
    Опции темы
CO4UHUTEJIb
Дата 18.5.2009, 17:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


O_o



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 18.5.2009

Репутация: нет
Всего: нет



Помогите пожалуйста. Суть программы в следующем: создаем три окошка - hWndm, hWndPrim, hWndColor. Далее в hWndPrim создаем кнопки, но при этом теряется дескриптор hWndm, хотя если создать еще один дескриптор - clone, и в него присвоить hWndm, то hWndm сохранится, а clone будет потерян. Если кнопки не создовать, то все работает верно. Подскажите пожалуйста, в чем ошибка.

Код

const unsigned short int kbut = 4;
unsigned short int nprim = 0;
int actcolor = 0;
HWND hWndm, clone, hWndPrim, hWndColor, hWndchek[kbut];
HDC hDC0;

int APIENTRY WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPSTR lpCmdLine, int nCmdShow){
    LPSTR szWindClass = "MyClass0";
    char **nambut = new char *[kbut];
    nambut[0] = new char[4];
    nambut[0] = "Line";
    nambut[1] = new char[9];
    nambut[1] = "Rectangle";
    nambut[2] = new char[7];
    nambut[2] = "Ellipse";
    nambut[3] = new char[3];
    nambut[3] = "Pie";
    nambut[4] = new char[5];
    nambut[4] = "Chord";

    WNDCLASS wc;
    wc.hInstance = hInst;
    wc.style = CS_HREDRAW | CS_VREDRAW;
    wc.hbrBackground = (HBRUSH)COLOR_WINDOWFRAME;
    wc.lpfnWndProc = WndProc;
    wc.cbClsExtra = 0;
    wc.cbWndExtra = 0;
    wc.hCursor = 0;
    wc.hIcon = 0;
    wc.lpszClassName = szWindClass;
    wc.lpszMenuName = 0;
    RegisterClass(&wc);

    hWndm = CreateWindow(szWindClass, "Мега_Программа_версия_3.0000а", WS_OVERLAPPEDWINDOW | WS_VISIBLE, 100, 100, 800, 500, 0, 0, hInst, 0);
    clone = hWndm;

    hWndColor = CreateWindow(szWindClass, "Colors", WS_THICKFRAME | WS_CAPTION | WS_VISIBLE, 10, 100, 100, 200, 0, 0, hInst, 0);
    hWndPrim = CreateWindow(szWindClass, "Primitive", WS_THICKFRAME | WS_CAPTION | WS_VISIBLE, 890, 100, 100, 200, 0, 0, hInst, 0);

    for(unsigned short int i = 0; i <= kbut; i++){
        hWndchek[i] = CreateWindow("BUTTON", nambut[i], WS_CHILD | WS_VISIBLE, 5, 5 + 20*i, 90, 20, hWndPrim, 0, hInst, 0);
        nambut[i] = 0;
    }

    hDC0 = GetDC(hWndm);
    
    MSG msg;
    while(GetMessage(&msg, 0, 0, 0)){
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }


Заранее благодарен за помощь!
PM MAIL   Вверх
586
Дата 19.5.2009, 02:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 39
Всего: 146



Цитата(CO4UHUTEJIb @  18.5.2009,  18:16 Найти цитируемый пост)
const unsigned short int kbut = 4;

Кнопок 5 штук. А не 4.
Цитата(CO4UHUTEJIb @  18.5.2009,  18:16 Найти цитируемый пост)
    nambut[0] = new char[4];
    nambut[0] = "Line";
    nambut[1] = new char[9];
    nambut[1] = "Rectangle";
    nambut[2] = new char[7];
    nambut[2] = "Ellipse";
    nambut[3] = new char[3];
    nambut[3] = "Pie";
    nambut[4] = new char[5];
    nambut[4] = "Chord";

Здесь присвыиваются указатели а не строки. Выделенная память теряется.
Памяти выделяется мало.
sizeof("Line") = 5
sizeof("Rectangle") = 10
и т.д.
Код
#include <windows.h>

const unsigned short int kbut = 5;       // !!!
unsigned short int nprim = 0;
int actcolor = 0;
HWND hWndm, clone, hWndPrim, hWndColor, hWndchek[kbut];
HDC hDC0;

LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch(uMsg)
    {
    case WM_DESTROY:
        PostQuitMessage(0);
        break;

    case WM_CLOSE:
        DestroyWindow(hWnd);
        break;
    }
    return DefWindowProc(hWnd, uMsg, wParam, lParam);
}

int APIENTRY WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPSTR lpCmdLine, int nCmdShow)
{
    LPSTR szWindClass = "MyClass0";
    char **nambut = new char*[kbut];
    nambut[0] = new char[5];
    strcpy(nambut[0], "Line");
    nambut[1] = new char[10];
    strcpy(nambut[1], "Rectangle");
    nambut[2] = new char[8];
    strcpy(nambut[2], "Ellipse");
    nambut[3] = new char[4];
    strcpy(nambut[3], "Pie");
    nambut[4] = new char[6];
    strcpy(nambut[4], "Chord");
    WNDCLASS wc;
    wc.hInstance = hInst;
    wc.style = CS_HREDRAW | CS_VREDRAW;
    wc.hbrBackground = (HBRUSH)COLOR_WINDOWFRAME;
    wc.lpfnWndProc = WndProc;
    wc.cbClsExtra = 0;
    wc.cbWndExtra = 0;
    wc.hCursor = LoadCursor(0, IDC_ARROW);
    wc.hIcon = 0;
    wc.lpszClassName = szWindClass;
    wc.lpszMenuName = 0;
    RegisterClass(&wc);
    hWndm = CreateWindow(szWindClass, "Ìåãà_Ïðîãðàììà_âåðñèÿ_3.0000à", WS_OVERLAPPEDWINDOW | WS_VISIBLE, 100, 100, 800, 500, 0, 0, hInst, 0);
    clone = hWndm;
    hWndColor = CreateWindow(szWindClass, "Colors", WS_THICKFRAME | WS_CAPTION | WS_VISIBLE, 10, 100, 100, 200, 0, 0, hInst, 0);
    hWndPrim = CreateWindow(szWindClass, "Primitive", WS_THICKFRAME | WS_CAPTION | WS_VISIBLE, 890, 100, 100, 200, 0, 0, hInst, 0);
    for(unsigned short int i = 0; i < kbut; i++){
        hWndchek[i] = CreateWindow("BUTTON", nambut[i], WS_CHILD | WS_VISIBLE, 5, 5 + 20*i, 90, 20, hWndPrim, 0, hInst, 0);
        delete nambut[i];
    }

    //hDC0 = GetDC(hWndm);

    MSG msg;
    while(GetMessage(&msg, 0, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    delete []nambut;
    return 0;
}


Это сообщение отредактировал(а) 586 - 19.5.2009, 04:12
PM   Вверх
GremlinProg
Дата 19.5.2009, 08:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



и зачем бумеранг вернулся, тема-то была помещена в правильный раздел


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0480 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.