Estilo visual thickframe no redimencionable en C++ 6.0 WinApi

Iniciado por xkiz ™, 1 Octubre 2011, 03:58 AM

0 Miembros y 1 Visitante están viendo este tema.

xkiz ™

pequeña consulta de principiante, tengo un ventana la cual necesito, por aspecto visual que sea como el ilustrado en la imagen de abajo, pero lo que no me sale es que esta ventana no se pueda redimendionar.



lo que estoy usando es lo siguiente:
Código (cpp) [Seleccionar]

HWND hWnd;
DWORD StyleEx, Style;

Style = DS_MODALFRAME | WS_POPUP |  WS_THICKFRAME;
StyleEx = WS_EX_TOOLWINDOW| WS_EX_STATICEDGE;

hInst = hInstance;
hWnd = CreateWindowEx(StyleEx, szWindowVol, "Volume", Style, CW_USEDEFAULT, CW_USEDEFAULT, 60, 200, DIALOGHWND, NULL, hInstance, NULL);



osea se que si le saco WS_THICKFRAME la ventana ya no es redimencionable, pero la verdad es que me parece que queda mejor visualmente así,osea hay algun estilo que me este olvidando de poner?
osea lo que trato de hacer es lo mismo que la ventana de Windows donde se controla el volumen.

Karman

fijate el mensaje WM_WINDOWPOSCHANGING


case WM_WINDOWPOSCHANGING:
    WINDOWPOS *pwp=(WINDOWPOS *)lParam;
    pwp->flags |= SWP_NOSIZE;
break;


S2

xkiz ™

nunca pense que una ventanitta me iba a complicar tanto, @Karman  WM_WINDOWPOSCHANGING no la conocía, igual me hace un efecto medio raro, vah  aplicando eso igual se puede redimencionar la ventana.

lo que trato de hacer es una ventana semi control del volumen de Windows7(no me acuerdo como era en XP)

arriba omití poner código:
Código (cpp) [Seleccionar]

LRESULT CALLBACK VolWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam){/*
FUNCTION: VolWndProc
PURPOSE : Manage the Volume control.
RESULT : None
*/
// int wmId, wmEvent;
RECT r,q;
POINT p;
int x;
int y;
WINDOWPOS *pwp;

switch (message) {
case WM_ACTIVATEAPP:
if(wParam == FALSE){
//OutputDebugString((LPCTSTR)"WM_ACTIVATEAPP lParam FALSE");
DestroyWindow(hWnd);
}
break;
case WM_CREATE:

GetWindowRect(GetDesktopWindow(), &r);
GetWindowRect(hWnd, &q);
SHAppBarMessage(ABM_GETTASKBARPOS, &abdAppBar);
GetCursorPos(&p);

if( (abdAppBar.rc.top > 100) ){ ///Bottom
y = ( (abdAppBar.rc.top - (q.bottom - q.top) ));
x = p.x -((q.right - q.left) /2);
}else if( (abdAppBar.rc.top <= 0) && (abdAppBar.rc.left <=0) && ( (abdAppBar.rc.right - abdAppBar.rc.left) < 600 ) ){ // Left
x = (abdAppBar.rc.right +10);
y = p.y -((q.bottom - q.top)-((q.bottom - q.top)/2) );
}else if( ( (abdAppBar.rc.right  - abdAppBar.rc.left  ) > 600) && ((abdAppBar.rc.bottom - abdAppBar.rc.top) < 600 ) ){ // Top
y = ( (abdAppBar.rc.bottom + 10 ));
x = p.x -((q.right - q.left) /2);
}else if( (abdAppBar.rc.left >100) ){ // Right
x = ( (r.right - (q.right - q.left))- (abdAppBar.rc.right - abdAppBar.rc.left) -10);
y = p.y -((q.bottom - q.top)-((q.bottom - q.top)/2) );
}else{
y = ( (abdAppBar.rc.top - (q.bottom - q.top) ));
x = p.x -((q.right - q.left) /2);
}
MoveWindow(hWnd, x,y, 56, 200, TRUE);
//SetWindowPos(hWnd, 0, x, y, q.right - q.left, (q.bottom - q.top), SWP_NOMOVE | SWP_FRAMECHANGED | SWP_NOACTIVATE);
//SetWindowPos(hWnd, 0,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE);

break;
/*case WM_WINDOWPOSCHANGING:
pwp=(WINDOWPOS *)lParam;
pwp->flags |= SWP_NOSIZE;
break;*/
case WM_SIZE:
//SetWindowPos(hWnd, 0, x, y, q.right - q.left, (q.bottom - q.top), SWP_NOMOVE | SWP_FRAMECHANGED | SWP_NOACTIVATE);
break;
case WM_NOTIFY:
int pos;
char dumy[10];
switch (((LPNMHDR)lParam)->code){
case NM_CUSTOMDRAW:
//if (((LPNMHDR)lParam)->idFrom == IDC_CUSTOMLISTBOX1){
if (((LPNMHDR)lParam)->hwndFrom  == Slider){
pos = (int)SendMessage(Slider, TBM_GETPOS, 0, 0);
StreamVolume = pos *-1;
sprintf(dumy,"%i %%", StreamVolume);
SetWindowText(StaticVol, dumy); //StaticVol: Static control
if(StreamLoaded){
SetVol(StreamVolume);// cambia el volumen MCISendString
}
break;
}
break;
break;
}
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
  }
  return 0;
}


yo pense que con SetWindowPos con SWP_NOSIZE lo iba a poder hacer pero no cambia nada.
encima no puedo capturar la ventana de control de volumen de windows con mingun Control Spy para ver el Style que tiene aplicado ni nada....

naderST

Yo estaba pensando en obtener el estilo de la ventana, el proceso se llama SndVol.exe puedes recorrer todas las ventanas y verificar que su proceso sea ese, si tengo tiempo mas tarde me pongo a probar...

BlackZeroX

#4
Solo debes cancelar el mensaje de NOTIFICACION al redimencionar la ventana...

con un Hook seria interceptar a WM_SYSCOMMAND y rectificar wParam... y cancelar!¡.


case WM_SYSCOMMAND:
    if ((wParam & 0xfff0) == SC_SIZE) return 0;
    break;


pero como ya tienes el Callback de la ventana solo debas ajustar esas lineas.

Dulces Lunas!¡.
The Dark Shadow is my passion.

Karman

Cita de: xkiz ™ en  1 Octubre 2011, 19:52 PMnunca pense que una ventanitta me iba a complicar tanto, @Karman  WM_WINDOWPOSCHANGING no la conocía, igual me hace un efecto medio raro, vah  aplicando eso igual se puede redimencionar la ventana.

Probaste desactivar el flag de redimencionamiento?

DWORD Style = (DS_MODALFRAME | WS_POPUP |  WS_THICKFRAME)&~WS_SIZEBOX;

S2

xkiz ™

#6
mm no se que hice que ahora no me anda nada se me crashea  de nada, no se que hice pero arruine todo, nada me anda del programa ya...

error de la PC Virtual, reinstalo la pc virtual y VS6 y veo que onda..
por ahora lo de @BlackZeroX, me sirve, pero...
@Karman: no lo habia conciderado, ahora cuando arregle la PCV lo pruebo.

EI: juntando mensajes.

bue, no se que paso ahora maquina virtual re formateada, limpia y todo lindo al iniciar la aplicación se cierra, al iniciar en modo de Debug me devuelve:

First-chance exception in Radio.exe: 0xC0000096: Privileged Instruction.
The program 'D:\Projects\VC++\Radio 2\Radio\Release\Radio.exe' has exited with code 0 (0x0).


haga lo que haga, pero si la pongo en la pc principal anda todo bien.
hasta que no solucione eso no puedo seguir con el proyecto.


Edit:
no se como ni por que, ahora todo funciona bien se soluciono solo ese problema comentado arriba.
@Karman: si le pongo eso en Stile, me lo visualiza sin bordes, como estilo clásico.

xkiz ™

#7
encontré la solución:

Código (cpp) [Seleccionar]

void create(){
HWND hWnd;
DWORD StyleEx, Style;

Style = DS_MODALFRAME | WS_POPUP |  WS_THICKFRAME;
StyleEx = WS_EX_TOOLWINDOW| WS_EX_STATICEDGE;

hInst = hInstance;
hWnd = CreateWindowEx(StyleEx, szWindowVol, "Volume", Style, CW_USEDEFAULT, CW_USEDEFAULT, 60, 200, DIALOGHWND, NULL, hInstance, NULL);
/// bla bla bla...........
}

LRESULT CALLBACK VolWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam){
switch (message) {
case WM_ACTIVATEAPP:
if(wParam == FALSE){
DestroyWindow(hWnd);
}
break;
case WM_NCHITTEST:
return -1;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
  return 0;
}


WM_NCHITTEST era el mensaje que tenia que interrumpir para que no permita redimencionar la ventana.



@BlackZeroX & @Karman muchas gracias por la ayuda.
PD: reposteo solo por que encontré la solución.