Окна

MagHaosa

Доброго времени суток друзья Вот то что я с горем пополам навоял (код програмки внизу),уж извините я не профи в этом деле О_о Суть программы Появляется окно При щечке мышью внутри окна появляется внутри этого окна еще второе окноА при очередном щелчке мыши внутри главного окна,внутреннее окошечко должно пропадать и появляться в другом углу главного окна Надеюсь понятно объяснил Проблема в том что у меня не работает как описал выше,как оно должно работать.А тупо появляются новые окна. Помогите мне разобраться . Заранее благодарю за помощь
#include<windows.h>
BOOL RegClass(WNDPROC,LPCTSTR,UINT);
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
LRESULT CALLBACK WndPopup(HWND,UINT,WPARAM,LPARAM);
HINSTANCE hInstance;
char szMainClass[]="MainClass";
char szPopupClass[]="PopupClass";
char szTitle[]="Пример!";
 
int WINAPI WinMain(HINSTANCE hInst,HINSTANCE hPrevInstance,
                   LPSTR lpszCmdLine,int nCmdShow)
{
    MSG msg;
    HWND hwnd;
    hInstance=hInst;
    if (!RegClass(WndProc,szMainClass,COLOR_WINDOW))
        return FALSE;
 
    if (!RegClass(WndPopup,szPopupClass,COLOR_BTNFACE))
        return FALSE;
 
    hwnd=CreateWindow(szMainClass,szTitle,WS_OVERLAPPEDWINDOW|WS_VISIBLE,
                                     CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,
                                     CW_USEDEFAULT,0,0,hInstance,NULL);
    if (!hwnd) return FALSE;
    while (GetMessage(&msg,0,0,0)) DispatchMessage(&msg);
    return msg.wParam;
}
BOOL RegClass(WNDPROC Proc,LPCTSTR szName,UINT brBackground)
{
WNDCLASS wc;
wc.style=wc.cbClsExtra=wc.cbWndExtra=0;
wc.lpfnWndProc=Proc;
wc.hInstance=hInstance;
wc.hIcon=LoadIcon(NULL,IDI_APPLICATION);
wc.hCursor=LoadCursor(NULL,IDC_ARROW);
wc.hbrBackground=(HBRUSH)(brBackground+1);
wc.lpszMenuName=(LPCTSTR)NULL;
wc.lpszClassName=szName;
return (RegisterClass(&wc)!=0);
 
}
    
LRESULT CALLBACK WndProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam)    
{
static short cxClient, cyClient,yStep,xStep;
static short left,top,Width,Height;
 
static HWND hwnds[5];
switch(msg)
{
   case WM_CREATE:
    {
    yStep=GetSystemMetrics(SM_CYCAPTION);
    return 0;
    }
   case WM_MOVE:
    {
    left=LOWORD(lParam);
    top=HIWORD(lParam);
    for (short j=0;j<5;j++)
        if (IsWindow(hwnds[j]))
            MoveWindow(hwnds[j],left+cxClient-Width-xStep*j,
                     top+cyClient-Height-yStep*j,Width,Height,TRUE);
    return 0;   
    }
   case WM_SIZE:
     { 
       cxClient=LOWORD(lParam);
       cyClient=HIWORD(lParam);
       Width=cxClient/2; Height=cyClient-4*yStep;
       xStep=(cxClient-Width)/4;
       for(short j=0;j<5;j++)
           if (IsWindow(hwnds[j]))
               MoveWindow(hwnds[j],left+cxClient-Width-xStep*j,
                     top+cyClient-Height-yStep*j,Width,Height,TRUE);
   return 0;
     }
   case WM_LBUTTONDOWN:
       {
       for (short j=0;j<5,IsWindow(hwnds[j]);j++);
       if (j>4) return 0;
       char str[20];
       _itoa(j+1,str,10);
       strcat(str,"-е окно");
       hwnds[j]=CreateWindow(szPopupClass,str,WS_POPUPWINDOW|WS_CAPTION|WS_VISIBLE,
                                          left+cxClient-Width-xStep*j,
                                          top+cyClient-Height-yStep*j,
                                          Width,Height,hwnd,0,hInstance,NULL);
       if (j>0)
       { SetWindowPos(hwnds[j],hwnds[j-1],0,0,Width,Height,SWP_NOMOVE);
       SetForegroundWindow(hwnds[0]);
       }
       return 0;
 
       }
   case WM_DESTROY:
       {
       PostQuitMessage(0);
       return 0;
       }
}
   return DefWindowProc(hwnd,msg,wParam,lParam);
}
LRESULT CALLBACK WndPopup(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam)   
{
    return DefWindowProc(hwnd,msg,wParam,lParam);
}
3 ответа

MagHaosa

if (j>0) { SetWindowPos(hwnds[j],hwnds[j-1],0,0,Width,Height,SWP_NOMOVE);
SWP_NOMOVE - не перемещать окно а после if (j>4) return 0; вообще ничего происходить не будет


MagHaosa

Чтоб не размножать темы попробую еще раз задать вопрос в своей теме.Так сказать добить эту тему Вот программа
#define STRICT 
#include <windows.h>  
#include <windowsx.h> 
 
 
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
 
 
HINSTANCE hInst;            
wchar_t ClassName[]=L"Window";      
wchar_t AppTitle[]=L"Application Win32";    
 
 
int WINAPI WinMain(
    HINSTANCE hInstance,        
    HINSTANCE,          
    LPSTR,              
                        
    int                 
                        
    )
{
    WNDCLASS wc;    
    MSG msg;        
    HWND hWnd;
    
 
    if((hWnd=FindWindow(ClassName, NULL))!=NULL)
    {
        
 
        if(IsIconic(hWnd)) ShowWindow(hWnd, SW_RESTORE);
        SetForegroundWindow(hWnd);
 
        
        return FALSE;
    }
 
    
    memset(&wc, 0, sizeof(wc));
    wc.lpszClassName=ClassName;             
    wc.lpfnWndProc=WndProc;         
    wc.style=CS_HREDRAW|CS_VREDRAW;     
    wc.hInstance=hInst;                 
    wc.hIcon=LoadIcon(NULL,IDI_APPLICATION);    
    wc.hCursor=LoadCursor(NULL,IDC_ARROW);      
    wc.hbrBackground=GetStockBrush(WHITE_BRUSH);    
    wc.lpszMenuName=NULL;               
    wc.cbClsExtra=0;                    
    wc.cbWndExtra=0;                    
 
    RegisterClass(&wc);
    
    hWnd=CreateWindow(
        ClassName,          
        AppTitle,               
        WS_OVERLAPPEDWINDOW, 
        10,                 
        10,             
        250,                    
        250,                
        NULL,               
        NULL,                   
        hInst,              
        NULL);          
    if(!hWnd) 
    {
        
        MessageBox(NULL,L"Create: error",AppTitle,MB_OK|MB_ICONSTOP);
        return FALSE;
    }
 
    ShowWindow(hWnd, SW_SHOWNORMAL);
 
 
    UpdateWindow(hWnd);
 
    
    while(GetMessage(&msg, NULL, 0, 0))
    {
        
        TranslateMessage(&msg);
 
        
        DispatchMessage(&msg);
    }
 
    return 0;
}
 
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, 
                                                          WPARAM wParam, LPARAM lParam)
{
    wchar_t *str=L"First Windows aplication";
 
    switch(msg)
    {
        
        case WM_PAINT: 
        {
            HDC hDC;
            PAINTSTRUCT ps;
 
            hDC=BeginPaint(hWnd,&ps);       
            TextOut(hDC,20,20,str,strlen(str)); 
            EndPaint(hWnd,&ps);         
        }; break;
    
        case WM_LBUTTONDOWN:
        {
            MessageBox(hWnd, L"32-bit aplication", L"Window",
                         MB_OK|MB_ICONINFORMATION);
 
        }; break;
 
        
        case WM_DESTROY:
        {
            
            PostQuitMessage(0);
        }; break;
        
        default: return DefWindowProc(hWnd, msg, wParam, lParam);
    }
    return 0;
}
Компилятор VS 2010 да и в восьмерке тож Выдает такую хренотень
1>------ Построение начато: проект: fgh, Конфигурация: Debug Win32 ------
1>Построение начато 27.06.2010 18:03:56.
1>InitializeBuildStatus:
1>  Обращение к "Debug\fgh.unsuccessfulbuild".
1>ClCompile:
1>  yui.cpp
1>c:\documents and settings\admin\мои документы\visual studio 2010\projects\fgh\fgh\yui.cpp(105): error C2664: strlen: невозможно преобразовать параметр 1 из "wchar_t *" в "const char *"
1>          Типы, на которые указывают указатели, не связаны; для преобразования требуется reinterpret_cast, приведение в стиле С или приведение в стиле функции
1>
1>СБОЙ построения.
1>
1>Затраченное время: 00:00:00.93
========== Построение: успешно: 0, с ошибками: 1, без изменений: 0, пропущено: 0 ==========
Есть кое какие советы или мысли по этому поводу Спасибо


MagHaosa

TextOutW(hDC, 20, 20, str, (int)wcslen(str));