Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> need help Win32 API, проблемы с DialogBox 
:(
    Опции темы
zavjalov_v
  Дата 21.10.2003, 10:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Написал приложение, когда выбираем Help-> About должен выскакивать Блок с описанием. Написано все на Win32 API в VisualC++6.0

Проблема в следующем. Этот ДиалогБокс создается, но с каким-то странным свойством: либо он прозрачный, или вообще не видно.
Если прозрачный, то видно только кнопку OK и все.
Вопрос сюда же. Если Диалог создан в редакторе ресурсов, и на нем есть статические объекты, то их надо инициализировать или они сами загрузятся как надо?

Вот исходник. По-другому даже не знаю как объяснить.
Код


#include <windows.h>

#include "resource.h"

namespace {
HINSTANCE  hInst;
HACCEL   hAccelTable;
HWND   hwnd;
char   szAppName[] =
char   szAppTitle[]=
};

LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
BOOL CALLBACK AboutDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);

BOOL InitApplication(HINSTANCE hInstance);
BOOL InitInstance(HINSTANCE hInstance, int nWidth, int nHeight, int nCmdShow);
void OnIdle();
int  Run();


int WINAPI WinMain(HINSTANCE hInstance,
      HINSTANCE hPrevInstance,
      LPSTR lpCmdLine,
      int nCmdShow)
{

hInst = hInstance;
if(!hPrevInstance)
{
 if(!InitApplication(hInstance))
  return 0;
}
if(!InitInstance(hInstance, 640, 480, nCmdShow) )
 return 0;

hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(APPLICATION) );

// InitCommonControls();

int nRet = Run();
return nRet;
}

BOOL InitApplication(HINSTANCE hInstance)
{
WNDCLASS wc;
HWND hWnd;
hWnd = FindWindow(szAppName, NULL);
if(hWnd)
{
 if(IsIconic(hWnd))
  ShowWindow(hWnd, SW_RESTORE);
 SetForegroundWindow(hWnd);
 return 0;
}

wc.cbClsExtra   = 0;
wc.cbWndExtra   = 0;
wc.hbrBackground  = (HBRUSH)GetStockObject(WHITE_BRUSH);
wc.hCursor    = LoadCursor(NULL, IDC_ARROW);
wc.hIcon    = LoadIcon(hInstance, MAKEINTRESOURCE(APPLICATION));
wc.hInstance   = hInstance;
wc.lpfnWndProc   = (WNDPROC)WndProc;
wc.lpszClassName  = szAppName;
wc.lpszMenuName   = MAKEINTRESOURCE(APPLICATION);
wc.style     = CS_HREDRAW | CS_VREDRAW;

if(!RegisterClass(&wc))
 return 0;
return 1;
}

BOOL InitInstance(HINSTANCE hInstance, int nWidth, int nHeight, int nCmdShow)
{
HWND hWnd = CreateWindow(szAppName, szAppTitle,
      WS_OVERLAPPEDWINDOW,
      (GetSystemMetrics(SM_CXSCREEN) - nWidth)/2,
      (GetSystemMetrics(SM_CYSCREEN) - nHeight)/2,
      nWidth, nHeight,
      NULL, NULL, hInstance, NULL);
hwnd = hWnd;
if(hwnd)
{
 ShowWindow(hwnd, nCmdShow);
 UpdateWindow(hwnd);
 return 1;
}
return 0;
}

int Run()
{
MSG msg = {0};
while( msg.message != WM_QUIT)
{
 if(PeekMessage(&msg, NULL, 0,0, PM_NOREMOVE))
 {
  if(GetMessage(&msg, NULL, 0, 0))
  {
   if(!TranslateAccelerator(hwnd, (HACCEL)hAccelTable, &msg ))
   {
    TranslateMessage(&msg);
    DispatchMessage(&msg);
   }
  }
 }
 else
  OnIdle();
}
return msg.wParam;
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
HDC hdc;
PAINTSTRUCT paintstruct;
int wmId, wmEvent;
RECT rc;

switch(uMsg)
{
case WM_SIZE:
 break;
case WM_PAINT:
 hdc = BeginPaint(hWnd, &paintstruct);
 TextOut(hdc, 1,1, "Hello world!", 12);
 EndPaint(hWnd, &paintstruct);
 break;
case WM_LBUTTONDOWN:
 hdc = GetDC(hWnd);
 TextOut(hdc, 10, 20, "Left button", 11);
 ReleaseDC(hWnd, hdc);
 break;
case WM_RBUTTONDOWN:
 hdc = GetDC(hWnd);
 TextOut(hdc, 10, 40, "Right button", 12);
 ReleaseDC(hWnd, hdc);
 break;
case WM_COMMAND:
 wmId    = LOWORD(wParam);
 wmEvent = HIWORD(wParam);
 switch(wmId)
 {
 case IDM_EXIT:
  DestroyWindow(hWnd);
  break;
 case IDM_NEW:
  MessageBox(hWnd, "Are you sure?", "Create New File", MB_YESNO);
  break;
 case IDM_OPEN:
  MessageBox(hWnd, "Are you sure?", "Create Open File", MB_YESNO);
  break;
 case IDM_SAVE:
  MessageBox(hWnd, "Are you sure?", "Create Save File", MB_YESNO);
  break;
 case IDM_SAVEAS:
  MessageBox(hWnd, "Are you sure?", "Create Save as File", MB_YESNO);
  break;
 case IDM_ABOUT:
  DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUT), hWnd, AboutDlgProc );
 
  return 1;
  //break;
 }
 break;
case WM_DESTROY:
 PostQuitMessage(0);
 break;
default:
 return CallWindowProc((WNDPROC)DefWindowProc, hWnd, uMsg, wParam, lParam );
}
return 0;
}

void OnIdle()
{

}

BOOL CALLBACK AboutDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
//static
switch(uMsg)
{

case WM_COMMAND:
 switch(LOWORD(wParam) )
 {
 case IDOK:
  ShowWindow(hDlg, SW_SHOW);
  SetForegroundWindow(hDlg);
  return 1;
 
 case IDCANCEL:
  EndDialog(hDlg, 0);
  return 1;
  break;
 }
 break;

}
return 1;
}




PM MAIL   Вверх
RAN
Дата 22.10.2003, 07:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Экс. модератор
Сообщений: 709
Регистрация: 14.3.2003
Где: Щёлково Моск.обл.

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



Цитата
ShowWindow(hDlg, SW_SHOW);
SetForegroundWindow(hDlg);

Зачем это там? Для теста?
Диалог должен возвращать FALSE, если сообщение не обработано. Замени последний return 1 в AboutDlgProc на return FALSE, а остальные return 1 лучше заменить на return TRUE;. Если быть совсем точным, то ты должен обработать сообщение WM_INITDIALOG так:
Код
case WM_INITDIALOG:
           return TRUE;

Это говорит о том, что ты не вызывал при инициализации SetFocus и предоставляешь это дело Windows.

По поводу ресурсов:
у статических элементов первое свойство - text. Его значение и будет помещено при загрузке в элемент:
LTEXT "Вот здесь текст", id, x, y, w, h, style, exstyle
PM MAIL ICQ   Вверх
zavjalov_v
Дата 22.10.2003, 17:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Спасибо. Заработало !!!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

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


 




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


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

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