Antes de asignar tu propio evento CloseQuery guarda el que pudiera tener el formulario para poder llamarlo en su momento. Te pongo un ejemplo, está en delphi pero imagino que no tendrás problemas para pasarlo a C++:
Código Delphi
[-]
unit CloseQuery;
interface
uses
Windows, SysUtils, Classes, Forms;
type
TCloseQueryComponent = class(TComponent)
private
FForm: TForm; FOldCloseQuery: TCloseQueryEvent;
protected
procedure ValidateContainer(AComponent: TComponent); override;
procedure Loaded; override;
procedure CloseQuery(Sender: TObject; var CanClose: Boolean); virtual;
public
constructor Create(AOwner: TComponent); override;
end;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents('buildero_d', [TCloseQueryComponent]);
end;
constructor TCloseQueryComponent.Create(AOwner: TComponent);
begin
inherited;
if AOwner is TForm then
FForm := TForm(AOwner);
end;
procedure TCloseQueryComponent.ValidateContainer(AComponent: TComponent);
begin
inherited;
if not (AComponent is TForm) then
raise Exception.Create('Este componente sólo puede insertarse en un formulario');
end;
procedure TCloseQueryComponent.Loaded;
begin
inherited;
if Assigned(FForm) then
begin
FOldCloseQuery := FForm.OnCloseQuery;
FForm.OnCloseQuery := CloseQuery;
end;
end;
procedure TCloseQueryComponent.CloseQuery(Sender: TObject; var CanClose: Boolean);
const
Flags = MB_YESNO or MB_ICONWARNING;
begin
if Assigned(FForm) then
begin
if Application.MessageBox('¿Desea cerrar esta ventana?', 'Confirmar', Flags) = ID_YES then
begin
CanClose := true;
if Assigned(FOldCloseQuery) then
FOldCloseQuery(FForm, CanClose);
end
else
CanClose := false;
end;
end;
end.
// Saludos