1. The window that wont die

This is a multi-part message in MIME format.
--------------030601000503000505010506


A couple of problems:
1)  When I click on the quit button -the 'x' in the corner- I don't receive
WM_QUIT (0x0012).  I get WM_NCLBUTTONDOWN and WM_NCLBUTTONUP and then 0x0118
which I can't find the meaning of.  Same for the minimize and resize buttons.

2)  When I try to change display modes from windowed to fullscreen, and vice
versa, the old window never gets killed.

Pressing the 'Esc' button closes the app down just fine.


--------------030601000503000505010506
Content-Type: text/plain;
 name="BaseOpenGL.exw"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline;
 filename="BaseOpenGL.exw"

include get.e
include dll.e
include machine.e
include msgbox.e

without warning

procedure not_found(sequence name)
    puts(1,'\n' & "Couldn't find " & name & '\n')
    while get_key() != 'n' do end while
    abort(1)
end procedure

function or_all(sequence s)
-- or together all elements of a sequence
    atom result

    result = 0
    for i = 1 to length(s) do
    result = or_bits(result, s[i])
    end for
    return result
end function

function link_c_func(atom dll, sequence name, sequence args, atom result)
-- dynamically link a C routine as a Euphoria function
    integer handle

    handle = define_c_func(dll, name, args, result)
    if handle = -1 then
    not_found(name)
    else
    return handle
    end if
end function

function link_c_proc(atom dll, sequence name, sequence args)
-- dynamically link a C routine as a Euphoria function
    integer handle

    handle = define_c_proc(dll, name, args)
    if handle = -1 then
    not_found(name)
    else
    return handle
    end if
end function

integer ChangeDisplaySettingsA, ShowCursor, ReleaseDC, UnregisterClassA,
GetModuleHandleA, LoadIconA,
LoadCursorA, RegisterClassA, AdjustWindowRectEx, CreateWindowExA,
        DestroyWindow, GetDC,
ChoosePixelFormat, SetPixelFormat, DescribePixelFormat, ShowWindow,
        SetForegroundWindow,
SetFocus, PostQuitMessage, DefWindowProcA, PeekMessageA,
        TranslateMessage, DispatchMessageA,
        GetLastError, FormatMessage

integer glViewport, glMatrixMode, glLoadIdentity, gluPerspective, glShadeModel,
glClearColor,
glClearDepth, glEnable, glDepthFunc, glHint, glClear, glTranslatef,
        glBegin, glEnd, glVertex3f,
        glColor3f, wglMakeCurrent, wglDeleteContext,
        wglCreateContext, wglSwapBuffers

procedure link_dll_routines()
    atom kernel32, user32, gdi32, gl, glu

    kernel32 = open_dll("kernel32.dll")
    if kernel32 = NULL then
        not_found("kernel32.dll")
    end if

    user32 = open_dll("user32.dll")
    if user32 = NULL then
        not_found("user32.dll")
    end if

    gdi32 = open_dll("gdi32.dll")
    if gdi32 = NULL then
        not_found("gdi32.dll")
    end if

    gl = open_dll("OpenGL32.dll")
    if gl = NULL then
        not_found("OpenGL32.dll")
    end if

    glu = open_dll("glu32.dll")
    if glu = NULL then
        not_found("glu32.dll")
    end if

ChangeDisplaySettingsA = link_c_func(user32, "ChangeDisplaySettingsA",
    {C_POINTER,C_DOUBLE}, C_LONG)
    ShowCursor = link_c_func(user32, "ShowCursor", {C_INT}, C_INT)
    ReleaseDC = link_c_func(user32, "ReleaseDC", {C_INT,C_INT}, C_INT)
UnregisterClassA = link_c_func(user32, "UnregisterClassA",
    {C_POINTER,C_INT}, C_INT)
GetModuleHandleA = link_c_func(kernel32, "GetModuleHandleA", {C_POINTER},
    C_INT)
    LoadIconA = link_c_func(user32, "LoadIconA", {C_INT,C_POINTER}, C_INT)
    LoadCursorA = link_c_func(user32, "LoadCursorA", {C_INT,C_POINTER}, C_INT)
    RegisterClassA = link_c_func(user32, "RegisterClassA", {C_POINTER}, C_INT)
AdjustWindowRectEx = link_c_func(user32, "AdjustWindowRectEx",
    {C_POINTER,C_DOUBLE,C_INT,C_DOUBLE}, C_INT)
CreateWindowExA = link_c_func(user32, "CreateWindowExA",
    {C_INT,C_POINTER,C_POINTER,C_INT,C_INT,C_INT,
C_INT,C_INT,C_INT,C_INT,C_INT,C_POINTER}, C_INT)
    DestroyWindow = link_c_func(user32, "GetDC", {C_INT}, C_INT)
    GetDC = link_c_func(user32, "GetDC", {C_INT}, C_INT)
ChoosePixelFormat = link_c_func(gdi32, "ChoosePixelFormat",
    {C_INT,C_POINTER}, C_INT)
SetPixelFormat = link_c_func(gdi32, "SetPixelFormat", {C_INT, C_INT,
    C_POINTER}, C_INT)
DescribePixelFormat = link_c_func(gdi32, "DescribePixelFormat", {C_INT,
    C_INT, C_UINT, C_POINTER}, C_INT)
    ShowWindow = link_c_func(user32, "ShowWindow", {C_INT,C_INT}, C_INT)
SetForegroundWindow = link_c_func(user32, "SetForegroundWindow", {C_INT},
    C_INT)
    SetFocus = link_c_func(user32, "SetFocus", {C_INT}, C_INT)
    PostQuitMessage = link_c_proc(user32, "PostQuitMessage", {C_INT})
DefWindowProcA = link_c_func(user32, "DefWindowProcA",
    {C_INT,C_INT,C_INT,C_INT}, C_INT)
PeekMessageA = link_c_func(user32, "PeekMessageA",
    {C_POINTER,C_INT,C_UINT,C_UINT,C_UINT},C_INT)
TranslateMessage = link_c_func(user32, "TranslateMessage", {C_POINTER},
    C_INT)
DispatchMessageA = link_c_func(user32, "DispatchMessageA", {C_POINTER},
    C_INT)
    GetLastError = link_c_func(kernel32, "GetLastError", {}, C_INT)
FormatMessage = link_c_func(kernel32,
    "FormatMessageA",{C_INT,C_POINTER,C_INT,C_INT,C_POINTER,C_INT,C_POINTER},C_INT)


    glViewport = link_c_proc(gl, "glViewport", {C_INT,C_INT,C_INT,C_INT})
    glMatrixMode = link_c_proc(gl, "glMatrixMode", {C_INT})
    glLoadIdentity = link_c_proc(gl, "glLoadIdentity", {})
gluPerspective = link_c_proc(glu, "gluPerspective",
    {C_FLOAT,C_FLOAT,C_FLOAT,C_FLOAT})
    glShadeModel = link_c_proc(gl, "glShadeModel", {C_INT})
glClearColor = link_c_proc(gl, "glClearColor",
    {C_FLOAT,C_FLOAT,C_FLOAT,C_FLOAT})
    glClearDepth = link_c_proc(gl, "glClearDepth", {C_FLOAT})
    glEnable = link_c_proc(gl, "glEnable", {C_INT})
    glDepthFunc = link_c_proc(gl, "glDepthFunc", {C_INT})
    glHint = link_c_proc(gl, "glHint", {C_INT,C_INT})
    glClear = link_c_proc(gl, "glClear", {C_INT})
    glTranslatef = link_c_proc(gl, "glTranslatef", {C_FLOAT,C_FLOAT,C_FLOAT})
    glBegin = link_c_proc(gl, "glBegin", {C_INT})
    glEnd = link_c_proc(gl, "glEnd", {})
    glVertex3f = link_c_proc(gl, "glVertex3f", {C_FLOAT,C_FLOAT,C_FLOAT})
    glColor3f = link_c_proc(gl, "glColor3f", {C_FLOAT,C_FLOAT,C_FLOAT})
    wglSwapBuffers = link_c_func(gl, "wglSwapBuffers", {C_INT}, C_INT)
    wglDeleteContext = link_c_func(gl,"wglDeleteContext", {C_INT}, C_INT)
    wglCreateContext = link_c_func(gl, "wglCreateContext", {C_INT}, C_INT)
    wglMakeCurrent = link_c_func(gl, "wglMakeCurrent", {C_INT,C_INT}, C_INT)

end procedure
link_dll_routines()

--look up the error code in the system error messages and display the
corresponding message
procedure ErrorMsg(integer error_num, integer funcnum)
    atom Error_message  --address of the returned error message buffer
    integer i

    Error_message = allocate(32)
    puts(1,'\n' & "System Error: ")
    i = 0
if not
    (c_func(FormatMessage,{#1100,NULL,error_num,0,Error_message,30,NULL})) then
    else
while peek(peek4u(Error_message) + i) != NULL do  --loop until the end
        of the string
            printf(1,"%s",peek(peek4u(Error_message) + i))
            i += 1
        end while
        printf(1,"  %d\n",funcnum)
    end if

end procedure

atom hRC, hDC, hWnd, hInstance
sequence keys keys = repeat(0,256)
constant TRUE = 1, FALSE = 0
integer active, fullscreen
active = TRUE
fullscreen = TRUE
hRC = NULL
hDC = NULL

constant GL_PROJECTION = #1701, GL_MODELVIEW = #1700
procedure ReSizeGLScene(integer width, integer height)
    if height = 0 then
        height = 1
    end if
    c_proc(glViewport,{0,0,width,height})
    c_proc(glMatrixMode,{GL_PROJECTION})
    c_proc(glLoadIdentity,{})
    c_proc(gluPerspective,{45.0,(width*1.0)/(height*1.0),0.1,100.0})
    c_proc(glMatrixMode,{GL_MODELVIEW})
    c_proc(glLoadIdentity,{})

end procedure

constant GL_SMOOTH = #1D01, GL_DEPTH_TEST = #0B71, GL_LEQUAL = #0203,
GL_PERSPECTIVE_CORRECTION_HINT = #0C50,
         GL_NICEST = #1102
function InitGL()

    c_proc(glShadeModel,{GL_SMOOTH})
    c_proc(glClearColor,{0.0,0.0,0.0,0.5})
    c_proc(glClearDepth,{1.0})
    c_proc(glEnable,{GL_DEPTH_TEST})
    c_proc(glDepthFunc,{GL_LEQUAL})
    c_proc(glHint,{GL_PERSPECTIVE_CORRECTION_HINT,GL_NICEST})

    return TRUE

end function

constant GL_COLOR_BUFFER_BIT = #00004000, GL_DEPTH_BUFFER_BIT = #00000100,
GL_TRIANGLES = #0004,
         GL_QUADS = #0007
function DrawGLScene()

    c_proc(glClear,{or_bits(GL_COLOR_BUFFER_BIT,GL_DEPTH_BUFFER_BIT)})
    c_proc(glLoadIdentity,{})

    c_proc(glTranslatef,{1.5,0.0,-6.0})
    c_proc(glBegin, {GL_TRIANGLES})
    c_proc(glColor3f, {1.0,0.0,0.0})
    c_proc(glVertex3f, {0.0,1.0,0.0})
    c_proc(glColor3f, {0.0,1.0,0.0})
    c_proc(glVertex3f, {-1.0,-1.0,0.0})
    c_proc(glColor3f, {0.0,0.0,1.0})
    c_proc(glVertex3f, {1.0,-1.0,0.0})
    c_proc(glEnd, {})

    c_proc(glTranslatef,{3.0,0.0,0.0})
    c_proc(glColor3f, {0.5,0.5,1.0})
    c_proc(glBegin, {GL_QUADS})
    c_proc(glVertex3f, {-1.0,1.0,0.0})
    c_proc(glVertex3f, {1.0,1.0,0.0})
    c_proc(glVertex3f, {1.0,-1.0,0.0})
    c_proc(glVertex3f, {-1.0,-1.0,0.0})
    c_proc(glEnd, {})

    return TRUE

end function

integer ClassName
procedure KillGLWindow()

    if fullscreen then
        if not c_func(ChangeDisplaySettingsA,{NULL,0}) then end if
        if not c_func(ShowCursor,{TRUE}) then end if
    end if

    if hRC then
        if not c_func(wglMakeCurrent,{NULL,NULL}) then
if message_box("Release of DC and RC failed","Shutdown
            Error",or_bits(MB_OK,MB_ICONINFORMATION)) then end if
        end if

        if not c_func(wglDeleteContext,{hRC}) then
if message_box("Release of Rendering Context failed","Shutdown
            Error",or_bits(MB_OK,MB_ICONINFORMATION)) then end if
        end if

        hRC = NULL
    end if

    if hDC and (not c_func(ReleaseDC,{hWnd,hDC})) then
if message_box("Release of Device Context failed","Shutdown
        Error",or_bits(MB_OK,MB_ICONINFORMATION)) then end if
        hDC = NULL
    end if

    if hWnd and (not c_func(DestroyWindow,{hWnd})) then
if message_box("Release window failed!","Shutdown Error",or_bits(MB_OK,
        MB_ICONINFORMATION)) then end if
        hWnd = NULL
    end if

    if c_func(UnregisterClassA,{ClassName,hInstance}) then
if message_box("Could not unregister class","Shutdown
        Error",or_bits(MB_OK,MB_ICONINFORMATION)) then end if
        hInstance = NULL
    end if

end procedure

constant WM_ACTIVATE = #0006, WM_SYSCOMMAND = #0112, SC_SCREENSAVE = #F140,
SC_MONITORPOWER = #F170, WM_CLOSE = #0010,
         WM_KEYDOWN = #0100, WM_KEYUP = #0101, WM_SIZE = #0005
function WndProc(atom hWnd, atom uMsg, atom wParam, atom lParam)

    if uMsg = WM_ACTIVATE then
        if not floor(wParam/#10000) then
            active = TRUE
        else
            active = FALSE
        end if
        return 0
    end if

    if  uMsg = WM_SYSCOMMAND then
        if wParam = SC_SCREENSAVE then end if
        if wParam = SC_MONITORPOWER then end if
        return 0
    end if

    if uMsg = WM_CLOSE then
        c_proc(PostQuitMessage,{0})
        return 0
    end if

    if uMsg = WM_KEYDOWN then
        keys[wParam] = TRUE
        return 0
    end if

    if uMsg = WM_KEYUP then
        keys[wParam] = FALSE
        return 0
    end if

    if uMsg = WM_SIZE then
        ReSizeGLScene(and_bits(lParam,#FFFF),floor(lParam/#10000))
        return 0
    end if

    return c_func(DefWindowProcA,{hWnd, uMsg, wParam, lParam})

end function

constant CS_HREDRAW = #0002, CS_VREDRAW = #0001, CS_OWNDC = #0020, IDI_WINLOGO =
32517, IDC_ARROW = 32512
function ClassRegistration()
    integer WndProcAddress, id, wc

    id = routine_id("WndProc")
    if id = -1 then
    puts(1, "routine_id failed!\n")
    abort(1)
    end if
    wc = allocate(40)
    WndProcAddress = call_back(id)
    hInstance = c_func(GetModuleHandleA,{NULL})
    ClassName = allocate_string("OpenGL")
    poke4(wc,or_all({CS_HREDRAW, CS_VREDRAW, CS_OWNDC}))
    poke4(wc+4,WndProcAddress)
    poke4(wc+8,0)
    poke4(wc+12,0)
    poke4(wc+16,hInstance)
    poke4(wc+20,c_func(LoadIconA,{NULL,IDI_WINLOGO}))
    poke4(wc+24,c_func(LoadCursorA,{NULL, IDC_ARROW}))
    poke4(wc+28,NULL)
    poke4(wc+32,NULL)
    poke4(wc+36,ClassName)

    if not c_func(RegisterClassA,{wc}) then
if message_box("Failed to register class","Error",
        or_bits(MB_OK,MB_ICONINFORMATION)) then end if
        return FALSE
    else
        return TRUE
    end if

end function

constant DM_BITSPERPEL = #00040000, DM_PELSWIDTH = #00080000, DM_PELSHEIGHT =
#00100000,
CDS_FULLSCREEN = #00000004, DISP_CHANGE_SUCCESSFUL = 0, WS_EX_APPWINDOW
         = #00040000,
WS_POPUP = #80000000, WS_EX_WINDOWEDGE = #00000100, WS_CLIPSIBLINGS =
         #04000000,
WS_OVERLAPPED = #00000000,WS_CAPTION = #00C00000, WS_SYSMENU =
         #00080000, WS_THICKFRAME = #00040000,
WS_MINIMIZEBOX = #00020000, WS_MAXIMIZEBOX = #00010000, WS_CLIPCHILDREN
         = #02000000,
PFD_DRAW_TO_WINDOW = #00000004, PFD_SUPPORT_OPENGL = #00000020,
         PFD_DOUBLEBUFFER = #40000000,
         PFD_TYPE_RGBA = 0, SW_SHOW = 5,
WS_OVERLAPPEDWINDOW =
         or_all({WS_OVERLAPPED,WS_CAPTION,WS_SYSMENU,WS_THICKFRAME,WS_MINIMIZEBOX,WS_MAXIMIZEBOX})
function CreateGLWindow(atom title, integer width, integer height, integer bits,
integer fullscreenflag)
    atom PixelFormat, wc, dmScreenSettings, pfd, WindowRect, dwExStyle, dwStyle
sequence s
    fullscreen = fullscreenflag

    if ClassRegistration() then end if

    if fullscreen then
        dmScreenSettings = allocate(156)
        mem_set(dmScreenSettings,0,156)
        s = int_to_bytes(156)
        poke(dmScreenSettings + 36,{s[1],s[2]})
poke4(dmScreenSettings +
        40,or_all({DM_BITSPERPEL,DM_PELSWIDTH,DM_PELSHEIGHT}))
        poke4(dmScreenSettings + 104, bits)
        poke4(dmScreenSettings + 108, width)
        poke4(dmScreenSettings + 112, height)

if c_func(ChangeDisplaySettingsA,{dmScreenSettings,CDS_FULLSCREEN}) !=
        DISP_CHANGE_SUCCESSFUL then
if message_box("The requested fullscreen mode is not supported
            by\nyour video card. " &
"Use windowed mode instead?","Error",
                           or_bits(MB_YESNO,MB_ICONEXCLAMATION)) = IDYES then
                fullscreen = FALSE
            else
if message_box("Program will now
                close","Error",or_bits(MB_OK,MB_ICONSTOP)) then end if
                return FALSE
            end if
        end if
    end if

    if fullscreen then
        dwExStyle = WS_EX_APPWINDOW
        dwStyle = WS_POPUP
        if c_func(ShowCursor,{FALSE}) then end if
    else
        dwExStyle = or_bits(WS_EX_APPWINDOW,WS_EX_WINDOWEDGE)
        dwStyle = WS_OVERLAPPEDWINDOW
    end if

    WindowRect = allocate(16)
    poke4(WindowRect,0)
    poke4(WindowRect + 4,width)
    poke4(WindowRect + 8, 0)
    poke4(WindowRect + 12, height)

if c_func(AdjustWindowRectEx,{WindowRect, dwStyle, FALSE, dwExStyle}) then
    end if
    hWnd = c_func(CreateWindowExA,{dwExStyle,
                                   ClassName,
                                   title,
or_all({WS_CLIPSIBLINGS,WS_CLIPCHILDREN,dwStyle}),
                                   0,
                                   0,
                                   peek4u(WindowRect + 4) - peek4u(WindowRect),
peek4u(WindowRect + 12) - peek4u(WindowRect +
                                   8),
                                   NULL,
                                   NULL,
                                   hInstance,
                                   NULL})

    if hWnd = NULL then
        KillGLWindow()
if message_box("Window creation
        error","Error",or_bits(MB_OK,MB_ICONEXCLAMATION)) then end if
        while not wait_key() do end while
        return FALSE
    end if

    pfd = allocate(40)
    mem_set(pfd,0,40)
    poke(pfd, 40)
    poke(pfd + 2, 1)
poke4(pfd + 4,
    or_all({PFD_DRAW_TO_WINDOW,PFD_SUPPORT_OPENGL,PFD_DOUBLEBUFFER}))
poke(pfd + 8, {PFD_TYPE_RGBA,
    and_bits(bits,#FF),0,0,0,0,0,0,0,0,0,0,0,0,0,16,0,0,0,0})
    poke4(pfd + 25, {0,0,0})

    hDC = c_func(GetDC,{hWnd})
    if not hDC then
        KillGLWindow()
if message_box("Can't create a GL device
        context","Error",or_bits(MB_OK,MB_ICONEXCLAMATION)) then end if
        return FALSE
    end if

    PixelFormat = c_func(ChoosePixelFormat,{hDC,pfd})
    if not PixelFormat then
        KillGLWindow()
if message_box("Can't find a suitable pixel
        format","Error",or_bits(MB_OK,MB_ICONEXCLAMATION)) then end if
        return FALSE
    end if

    if not (c_func(SetPixelFormat,{hDC,PixelFormat,pfd})) then
        KillGLWindow()
if message_box("Can't set the pixel
        format","Error",or_bits(MB_OK,MB_ICONEXCLAMATION)) then end if
        return FALSE
    end if

    if not c_func(DescribePixelFormat, {hDC,PixelFormat,40,pfd}) then
if message_box("Can't describe the pixel
        format","Error",or_bits(MB_OK,MB_ICONEXCLAMATION)) then end if
    end if

    hRC = c_func(wglCreateContext,{hDC})
    if not hRC then
        KillGLWindow()
if message_box("Can't create a GL rendering
        context","Error",or_bits(MB_OK,MB_ICONEXCLAMATION)) then end if
        return FALSE
    end if

    if not (c_func(wglMakeCurrent,{hDC,hRC})) then
        KillGLWindow()
if message_box("Can't activate the GL rendering
        context","Error",or_bits(MB_OK,MB_ICONEXCLAMATION)) then end if
        return FALSE
    end if

    if c_func(ShowWindow,{hWnd,SW_SHOW}) then end if
    if c_func(SetForegroundWindow,{hWnd}) then end if
    if c_func(SetFocus,{hWnd}) then end if

    ReSizeGLScene(width, height)

    if not InitGL() then
        KillGLWindow()
if message_box("Initialization
        failed","Error",or_bits(MB_OK,MB_ICONEXCLAMATION)) then end if
        return FALSE
    end if

    return TRUE

end function

constant PM_REMOVE = #0001, WM_QUIT = #0012, VK_ESCAPE = #1B, VK_F1 = #70
procedure WinMain()
    integer MSG, done, title, msg_message
    sequence s

    MSG = allocate(28)
    done = FALSE
    title = allocate_string("OpenGL")

if message_box("Would you like to run in fullscreen mode?","Start
    Fullscreen?",or_bits(MB_YESNO,MB_ICONQUESTION)) = IDNO then
        fullscreen = FALSE
    else
        fullscreen = TRUE
    end if


    if not CreateGLWindow(title,640,480,16,fullscreen) then
        --return 0
    end if

    while not done do
        if c_func(PeekMessageA,{MSG,NULL,0,0,PM_REMOVE}) then
            s = peek({MSG+4,2})
            msg_message = bytes_to_int({s[1],s[2],0,0})
            printf(1,"msg.message = 0x%04x\n",msg_message)
            if msg_message = WM_QUIT then
                done = TRUE
                if not wait_key() then end if
            else
                if c_func(TranslateMessage,{MSG}) then end if
                if c_func(DispatchMessageA,{MSG}) then end if
            end if
        else
            if active then
                if keys[VK_ESCAPE] then
                    done = TRUE
                else
                    if DrawGLScene() then end if
                    if c_func(wglSwapBuffers,{hDC}) then end if
                end if

                if keys[VK_F1] then
                    keys[VK_F1] = FALSE
                    KillGLWindow()
                    if fullscreen = 0 then
                        fullscreen = 1
                    else
                        fullscreen = 0
                    end if

                    if not CreateGLWindow(title,640,480,16,fullscreen) then
                        --return 0
                    end if
                end if
            end if
        end if
    end while

    KillGLWindow()
    --return peek4u(MSG + 8)

end procedure

WinMain()
--------------030601000503000505010506--

new topic     » topic index » view message » categorize

2. Re: The window that wont die

This is a multi-part message in MIME format.
--------------010601060303060907030605

Did my attachment not come through?  I'll try to resend it.
I am programming using the Windows API directly

Here are the main functions I'm using for resizing the display:
c_func(ChangeDisplaySettingsA,{dmScreenSettings,CDS_FULLSCREEN})
c_func(AdjustWindowRectEx,{WindowRect, dwStyle, FALSE, dwExStyle})
c_func(AdjustWindowRectEx,{WindowRect, dwStyle, FALSE, dwExStyle}) then 
end if
c_func(CreateWindowExA,{dwExStyle,
                                   ClassName,
                                   title,
                                   
or_all({WS_CLIPSIBLINGS,WS_CLIPCHILDREN,dwStyle}),
                                   0,
                                   0,
                                   peek4u(WindowRect + 4) - 
peek4u(WindowRect),
                                   peek4u(WindowRect + 12) - 
peek4u(WindowRect + 8),
                                   NULL,
                                   NULL,
                                   hInstance,
                                   NULL})

This seems to work.  The problem seems to be, before it goes through 
these routines, the routine to kill the previous window doesn't work. 
 That routine is as follows:
procedure KillGLWindow()

    if fullscreen then
        if not c_func(ChangeDisplaySettingsA,{NULL,0}) then end if
        if not c_func(ShowCursor,{TRUE}) then end if
    end if

    if hRC then
        if not c_func(wglMakeCurrent,{NULL,NULL}) then
            if message_box("Release of DC and RC failed","Shutdown 
Error",or_bits(MB_OK,MB_ICONINFORMATION)) then end if
        end if

        if not c_func(wglDeleteContext,{hRC}) then
            if message_box("Release of Rendering Context 
failed","Shutdown Error",or_bits(MB_OK,MB_ICONINFORMATION)) then end if
        end if

        hRC = NULL
    end if

    if hDC and not c_func(ReleaseDC,{hWnd,hDC}) then
        if message_box("Release of Device Context failed","Shutdown 
Error",or_bits(MB_OK,MB_ICONINFORMATION)) then end if
        hDC = NULL
    end if

    if hWnd and not c_func(DestroyWindow,{hWnd}) then
        if message_box("Release window failed!","Shutdown 
Error",or_bits(MB_OK, MB_ICONINFORMATION)) then end if
        hWnd = NULL
    end if

    if c_func(UnregisterClassA,{ClassName,hInstance}) then
        if message_box("Could not unregister class","Shutdown 
Error",or_bits(MB_OK,MB_ICONINFORMATION)) then end if
        hInstance = NULL
    end if

end procedure

Brian Broker wrote:

>
>
>A couple of questions:
>1)  Are you using a windows programming library?  (If so, which one?)
>2)  How are you changing display modes?
>
>-- Brian
>
>1evan wrote:
>  
>
>>A couple of problems:
>>1)  When I click on the quit button -the 'x' in the corner- I don't 
>>receive WM_QUIT (0x0012).  I get WM_NCLBUTTONDOWN and WM_NCLBUTTONUP and 
>>then 0x0118 which I can't find the meaning of.  Same for the minimize 
>>and resize buttons.
>>
>>2)  When I try to change display modes from windowed to fullscreen, and 
>>vice versa, the old window never gets killed.
>>
>>Pressing the 'Esc' button closes the app down just fine.
>>
>>
>
>
>TOPICA - Start your own email discussion group. FREE!
>
>

-- 
     |\      _,,,---,,_
    /,`.-'`'    -.  ;-;;,_
   |,4-  ) )-,_..;\ (  `'-'
  '---''(_/--'  `-'\_)`-'\_)



--------------010601060303060907030605
Content-Type: text/plain;
 name="BaseOpenGL.exw"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline;
 filename="BaseOpenGL.exw"

include get.e
include dll.e
include machine.e
include msgbox.e

without warning

procedure not_found(sequence name)
    puts(1,'\n' & "Couldn't find " & name & '\n')
    while get_key() != 'n' do end while
    abort(1)
end procedure

function or_all(sequence s)
-- or together all elements of a sequence
    atom result

    result = 0
    for i = 1 to length(s) do
    result = or_bits(result, s[i])
    end for
    return result
end function

function link_c_func(atom dll, sequence name, sequence args, atom result)
-- dynamically link a C routine as a Euphoria function
    integer handle

    handle = define_c_func(dll, name, args, result)
    if handle = -1 then
    not_found(name)
    else
    return handle
    end if
end function

function link_c_proc(atom dll, sequence name, sequence args)
-- dynamically link a C routine as a Euphoria function
    integer handle

    handle = define_c_proc(dll, name, args)
    if handle = -1 then
    not_found(name)
    else
    return handle
    end if
end function

integer ChangeDisplaySettingsA, ShowCursor, ReleaseDC, UnregisterClassA,
GetModuleHandleA, LoadIconA,
LoadCursorA, RegisterClassA, AdjustWindowRectEx, CreateWindowExA,
        DestroyWindow, GetDC,
ChoosePixelFormat, SetPixelFormat, DescribePixelFormat, ShowWindow,
        SetForegroundWindow,
SetFocus, PostQuitMessage, DefWindowProcA, PeekMessageA,
        TranslateMessage, DispatchMessageA,
        GetLastError, FormatMessage

integer glViewport, glMatrixMode, glLoadIdentity, gluPerspective, glShadeModel,
glClearColor,
glClearDepth, glEnable, glDepthFunc, glHint, glClear, glTranslatef,
        glBegin, glEnd, glVertex3f,
        glColor3f, wglMakeCurrent, wglDeleteContext,
        wglCreateContext, wglSwapBuffers

procedure link_dll_routines()
    atom kernel32, user32, gdi32, gl, glu

    kernel32 = open_dll("kernel32.dll")
    if kernel32 = NULL then
        not_found("kernel32.dll")
    end if

    user32 = open_dll("user32.dll")
    if user32 = NULL then
        not_found("user32.dll")
    end if

    gdi32 = open_dll("gdi32.dll")
    if gdi32 = NULL then
        not_found("gdi32.dll")
    end if

    gl = open_dll("OpenGL32.dll")
    if gl = NULL then
        not_found("OpenGL32.dll")
    end if

    glu = open_dll("glu32.dll")
    if glu = NULL then
        not_found("glu32.dll")
    end if

ChangeDisplaySettingsA = link_c_func(user32, "ChangeDisplaySettingsA",
    {C_POINTER,C_DOUBLE}, C_LONG)
    ShowCursor = link_c_func(user32, "ShowCursor", {C_INT}, C_INT)
    ReleaseDC = link_c_func(user32, "ReleaseDC", {C_INT,C_INT}, C_INT)
UnregisterClassA = link_c_func(user32, "UnregisterClassA",
    {C_POINTER,C_INT}, C_INT)
GetModuleHandleA = link_c_func(kernel32, "GetModuleHandleA", {C_POINTER},
    C_INT)
    LoadIconA = link_c_func(user32, "LoadIconA", {C_INT,C_POINTER}, C_INT)
    LoadCursorA = link_c_func(user32, "LoadCursorA", {C_INT,C_POINTER}, C_INT)
    RegisterClassA = link_c_func(user32, "RegisterClassA", {C_POINTER}, C_INT)
AdjustWindowRectEx = link_c_func(user32, "AdjustWindowRectEx",
    {C_POINTER,C_DOUBLE,C_INT,C_DOUBLE}, C_INT)
CreateWindowExA = link_c_func(user32, "CreateWindowExA",
    {C_INT,C_POINTER,C_POINTER,C_INT,C_INT,C_INT,
C_INT,C_INT,C_INT,C_INT,C_INT,C_POINTER}, C_INT)
    DestroyWindow = link_c_func(user32, "GetDC", {C_INT}, C_INT)
    GetDC = link_c_func(user32, "GetDC", {C_INT}, C_INT)
ChoosePixelFormat = link_c_func(gdi32, "ChoosePixelFormat",
    {C_INT,C_POINTER}, C_INT)
SetPixelFormat = link_c_func(gdi32, "SetPixelFormat", {C_INT, C_INT,
    C_POINTER}, C_INT)
DescribePixelFormat = link_c_func(gdi32, "DescribePixelFormat", {C_INT,
    C_INT, C_UINT, C_POINTER}, C_INT)
    ShowWindow = link_c_func(user32, "ShowWindow", {C_INT,C_INT}, C_INT)
SetForegroundWindow = link_c_func(user32, "SetForegroundWindow", {C_INT},
    C_INT)
    SetFocus = link_c_func(user32, "SetFocus", {C_INT}, C_INT)
    PostQuitMessage = link_c_proc(user32, "PostQuitMessage", {C_INT})
DefWindowProcA = link_c_func(user32, "DefWindowProcA",
    {C_INT,C_INT,C_INT,C_INT}, C_INT)
PeekMessageA = link_c_func(user32, "PeekMessageA",
    {C_POINTER,C_INT,C_UINT,C_UINT,C_UINT},C_INT)
TranslateMessage = link_c_func(user32, "TranslateMessage", {C_POINTER},
    C_INT)
DispatchMessageA = link_c_func(user32, "DispatchMessageA", {C_POINTER},
    C_INT)
    GetLastError = link_c_func(kernel32, "GetLastError", {}, C_INT)
FormatMessage = link_c_func(kernel32,
    "FormatMessageA",{C_INT,C_POINTER,C_INT,C_INT,C_POINTER,C_INT,C_POINTER},C_INT)


    glViewport = link_c_proc(gl, "glViewport", {C_INT,C_INT,C_INT,C_INT})
    glMatrixMode = link_c_proc(gl, "glMatrixMode", {C_INT})
    glLoadIdentity = link_c_proc(gl, "glLoadIdentity", {})
gluPerspective = link_c_proc(glu, "gluPerspective",
    {C_FLOAT,C_FLOAT,C_FLOAT,C_FLOAT})
    glShadeModel = link_c_proc(gl, "glShadeModel", {C_INT})
glClearColor = link_c_proc(gl, "glClearColor",
    {C_FLOAT,C_FLOAT,C_FLOAT,C_FLOAT})
    glClearDepth = link_c_proc(gl, "glClearDepth", {C_FLOAT})
    glEnable = link_c_proc(gl, "glEnable", {C_INT})
    glDepthFunc = link_c_proc(gl, "glDepthFunc", {C_INT})
    glHint = link_c_proc(gl, "glHint", {C_INT,C_INT})
    glClear = link_c_proc(gl, "glClear", {C_INT})
    glTranslatef = link_c_proc(gl, "glTranslatef", {C_FLOAT,C_FLOAT,C_FLOAT})
    glBegin = link_c_proc(gl, "glBegin", {C_INT})
    glEnd = link_c_proc(gl, "glEnd", {})
    glVertex3f = link_c_proc(gl, "glVertex3f", {C_FLOAT,C_FLOAT,C_FLOAT})
    glColor3f = link_c_proc(gl, "glColor3f", {C_FLOAT,C_FLOAT,C_FLOAT})
    wglSwapBuffers = link_c_func(gl, "wglSwapBuffers", {C_INT}, C_INT)
    wglDeleteContext = link_c_func(gl,"wglDeleteContext", {C_INT}, C_INT)
    wglCreateContext = link_c_func(gl, "wglCreateContext", {C_INT}, C_INT)
    wglMakeCurrent = link_c_func(gl, "wglMakeCurrent", {C_INT,C_INT}, C_INT)

end procedure
link_dll_routines()

--look up the error code in the system error messages and display the
corresponding message
procedure ErrorMsg(integer error_num, integer funcnum)
    atom Error_message  --address of the returned error message buffer
    integer i

    Error_message = allocate(32)
    puts(1,'\n' & "System Error: ")
    i = 0
if not
    (c_func(FormatMessage,{#1100,NULL,error_num,0,Error_message,30,NULL})) then
    else
while peek(peek4u(Error_message) + i) != NULL do  --loop until the end
        of the string
            printf(1,"%s",peek(peek4u(Error_message) + i))
            i += 1
        end while
        printf(1,"  %d\n",funcnum)
    end if

end procedure

atom hRC, hDC, hWnd, hInstance
sequence keys keys = repeat(0,256)  -- array to hold key presses
constant TRUE = 1, FALSE = 0
integer active, fullscreen
active = TRUE
fullscreen = TRUE
hRC = NULL
hDC = NULL

constant GL_PROJECTION = #1701, GL_MODELVIEW = #1700
procedure ReSizeGLScene(integer width, integer height)
    if height = 0 then
        height = 1
    end if
    c_proc(glViewport,{0,0,width,height})
    c_proc(glMatrixMode,{GL_PROJECTION})
    c_proc(glLoadIdentity,{})
    c_proc(gluPerspective,{45.0,(width*1.0)/(height*1.0),0.1,100.0})
    c_proc(glMatrixMode,{GL_MODELVIEW})
    c_proc(glLoadIdentity,{})

end procedure

constant GL_SMOOTH = #1D01, GL_DEPTH_TEST = #0B71, GL_LEQUAL = #0203,
GL_PERSPECTIVE_CORRECTION_HINT = #0C50,
         GL_NICEST = #1102
function InitGL()

    c_proc(glShadeModel,{GL_SMOOTH})
    c_proc(glClearColor,{0.0,0.0,0.0,0.5})
    c_proc(glClearDepth,{1.0})
    c_proc(glEnable,{GL_DEPTH_TEST})
    c_proc(glDepthFunc,{GL_LEQUAL})
    c_proc(glHint,{GL_PERSPECTIVE_CORRECTION_HINT,GL_NICEST})

    return TRUE

end function

constant GL_COLOR_BUFFER_BIT = #00004000, GL_DEPTH_BUFFER_BIT = #00000100,
GL_TRIANGLES = #0004,
         GL_QUADS = #0007
function DrawGLScene()

    c_proc(glClear,{or_bits(GL_COLOR_BUFFER_BIT,GL_DEPTH_BUFFER_BIT)})
    c_proc(glLoadIdentity,{})

    c_proc(glTranslatef,{1.5,0.0,-6.0})
    c_proc(glBegin, {GL_TRIANGLES})
    c_proc(glColor3f, {1.0,0.0,0.0})
    c_proc(glVertex3f, {0.0,1.0,0.0})
    c_proc(glColor3f, {0.0,1.0,0.0})
    c_proc(glVertex3f, {-1.0,-1.0,0.0})
    c_proc(glColor3f, {0.0,0.0,1.0})
    c_proc(glVertex3f, {1.0,-1.0,0.0})
    c_proc(glEnd, {})

    c_proc(glTranslatef,{3.0,0.0,0.0})
    c_proc(glColor3f, {0.5,0.5,1.0})
    c_proc(glBegin, {GL_QUADS})
    c_proc(glVertex3f, {-1.0,1.0,0.0})
    c_proc(glVertex3f, {1.0,1.0,0.0})
    c_proc(glVertex3f, {1.0,-1.0,0.0})
    c_proc(glVertex3f, {-1.0,-1.0,0.0})
    c_proc(glEnd, {})

    return TRUE

end function

integer ClassName
procedure KillGLWindow()

    if fullscreen then
        if not c_func(ChangeDisplaySettingsA,{NULL,0}) then end if
        if not c_func(ShowCursor,{TRUE}) then end if
    end if

    if hRC then
        if not c_func(wglMakeCurrent,{NULL,NULL}) then
if message_box("Release of DC and RC failed","Shutdown
            Error",or_bits(MB_OK,MB_ICONINFORMATION)) then end if
        end if

        if not c_func(wglDeleteContext,{hRC}) then
if message_box("Release of Rendering Context failed","Shutdown
            Error",or_bits(MB_OK,MB_ICONINFORMATION)) then end if
        end if

        hRC = NULL
    end if

    if hDC and not c_func(ReleaseDC,{hWnd,hDC}) then
if message_box("Release of Device Context failed","Shutdown
        Error",or_bits(MB_OK,MB_ICONINFORMATION)) then end if
        hDC = NULL
    end if

    if hWnd and not c_func(DestroyWindow,{hWnd}) then
if message_box("Release window failed!","Shutdown Error",or_bits(MB_OK,
        MB_ICONINFORMATION)) then end if
        hWnd = NULL
    end if

    if c_func(UnregisterClassA,{ClassName,hInstance}) then
if message_box("Could not unregister class","Shutdown
        Error",or_bits(MB_OK,MB_ICONINFORMATION)) then end if
        hInstance = NULL
    end if

end procedure

constant WM_ACTIVATE = #0006, WM_SYSCOMMAND = #0112, SC_SCREENSAVE = #F140,
SC_MONITORPOWER = #F170, WM_CLOSE = #0010,
         WM_KEYDOWN = #0100, WM_KEYUP = #0101, WM_SIZE = #0005
function WndProc(atom hWnd, integer uMsg, atom wParam, atom lParam)
printf(1,"uMsg = 0x%4x\n",uMsg)
    if uMsg = WM_ACTIVATE then
        if not floor(wParam/#10000) then
            active = TRUE
        else
            active = FALSE
        end if
        return 0
    end if

    if  uMsg = WM_SYSCOMMAND then
        if wParam = SC_SCREENSAVE then end if
        if wParam = SC_MONITORPOWER then end if
        return 0
    end if

    if uMsg = WM_CLOSE then
        c_proc(PostQuitMessage,{0})
        return 0
    end if

    if uMsg = WM_KEYDOWN then
        keys[wParam] = TRUE
        return 0
    end if

    if uMsg = WM_KEYUP then
        keys[wParam] = FALSE
        return 0
    end if

    if uMsg = WM_SIZE then
        ReSizeGLScene(and_bits(lParam,#FFFF),floor(lParam/#10000))
        return 0
    end if

    return c_func(DefWindowProcA,{hWnd, uMsg, wParam, lParam})

end function

constant CS_HREDRAW = #0002, CS_VREDRAW = #0001, CS_OWNDC = #0020, IDI_WINLOGO =
32517, IDC_ARROW = 32512
function ClassRegistration()
    integer WndProcAddress, id, wc

    id = routine_id("WndProc")
    if id = -1 then
    puts(1, "routine_id failed!\n")
    abort(1)
    end if
    wc = allocate(40)
    WndProcAddress = call_back(id)
    hInstance = c_func(GetModuleHandleA,{NULL})
    ClassName = allocate_string("OpenGL")
    poke4(wc,or_all({CS_HREDRAW, CS_VREDRAW, CS_OWNDC}))
    poke4(wc+4,WndProcAddress)
    poke4(wc+8,0)
    poke4(wc+12,0)
    poke4(wc+16,hInstance)
    poke4(wc+20,c_func(LoadIconA,{NULL,IDI_WINLOGO}))
    poke4(wc+24,c_func(LoadCursorA,{NULL, IDC_ARROW}))
    poke4(wc+28,NULL)
    poke4(wc+32,NULL)
    poke4(wc+36,ClassName)

    if not c_func(RegisterClassA,{wc}) then
if message_box("Failed to register class","Error",
        or_bits(MB_OK,MB_ICONINFORMATION)) then end if
        return FALSE
    else
        return TRUE
    end if

end function

constant DM_BITSPERPEL = #00040000, DM_PELSWIDTH = #00080000, DM_PELSHEIGHT =
#00100000,
CDS_FULLSCREEN = #00000004, DISP_CHANGE_SUCCESSFUL = 0, WS_EX_APPWINDOW
         = #00040000,
WS_POPUP = #80000000, WS_EX_WINDOWEDGE = #00000100, WS_CLIPSIBLINGS =
         #04000000,
WS_OVERLAPPED = #00000000,WS_CAPTION = #00C00000, WS_SYSMENU =
         #00080000, WS_THICKFRAME = #00040000,
WS_MINIMIZEBOX = #00020000, WS_MAXIMIZEBOX = #00010000, WS_CLIPCHILDREN
         = #02000000,
PFD_DRAW_TO_WINDOW = #00000004, PFD_SUPPORT_OPENGL = #00000020,
         PFD_DOUBLEBUFFER = #40000000,
         PFD_TYPE_RGBA = 0, SW_SHOW = 5,
WS_OVERLAPPEDWINDOW =
         or_all({WS_OVERLAPPED,WS_CAPTION,WS_SYSMENU,WS_THICKFRAME,WS_MINIMIZEBOX,WS_MAXIMIZEBOX})
function CreateGLWindow(atom title, integer width, integer height, integer bits,
integer fullscreenflag)
    atom PixelFormat, wc, dmScreenSettings, pfd, WindowRect, dwExStyle, dwStyle
sequence s
    fullscreen = fullscreenflag

    if ClassRegistration() then end if

    if fullscreen then
        dmScreenSettings = allocate(156)
        mem_set(dmScreenSettings,0,156)
        s = int_to_bytes(156)
        poke(dmScreenSettings + 36,{s[1],s[2]})
poke4(dmScreenSettings +
        40,or_all({DM_BITSPERPEL,DM_PELSWIDTH,DM_PELSHEIGHT}))
        poke4(dmScreenSettings + 104, bits)
        poke4(dmScreenSettings + 108, width)
        poke4(dmScreenSettings + 112, height)

if c_func(ChangeDisplaySettingsA,{dmScreenSettings,CDS_FULLSCREEN}) !=
        DISP_CHANGE_SUCCESSFUL then
if message_box("The requested fullscreen mode is not supported
            by\nyour video card. " &
"Use windowed mode instead?","Error",
                           or_bits(MB_YESNO,MB_ICONEXCLAMATION)) = IDYES then
                fullscreen = FALSE
            else
if message_box("Program will now
                close","Error",or_bits(MB_OK,MB_ICONSTOP)) then end if
                return FALSE
            end if
        end if
    end if

    if fullscreen then
        dwExStyle = WS_EX_APPWINDOW
        dwStyle = WS_POPUP
        if c_func(ShowCursor,{FALSE}) then end if
    else
        dwExStyle = or_bits(WS_EX_APPWINDOW,WS_EX_WINDOWEDGE)
        dwStyle = WS_OVERLAPPEDWINDOW
    end if

    WindowRect = allocate(16)
    poke4(WindowRect,0)
    poke4(WindowRect + 4,width)
    poke4(WindowRect + 8, 0)
    poke4(WindowRect + 12, height)

if c_func(AdjustWindowRectEx,{WindowRect, dwStyle, FALSE, dwExStyle}) then
    end if
    hWnd = c_func(CreateWindowExA,{dwExStyle,
                                   ClassName,
                                   title,
or_all({WS_CLIPSIBLINGS,WS_CLIPCHILDREN,dwStyle}),
                                   0,
                                   0,
                                   peek4u(WindowRect + 4) - peek4u(WindowRect),
peek4u(WindowRect + 12) - peek4u(WindowRect +
                                   8),
                                   NULL,
                                   NULL,
                                   hInstance,
                                   NULL})

    if hWnd = NULL then
        KillGLWindow()
if message_box("Window creation
        error","Error",or_bits(MB_OK,MB_ICONEXCLAMATION)) then end if
        while not wait_key() do end while
        return FALSE
    end if

    pfd = allocate(40)
    mem_set(pfd,0,40)
    poke(pfd, 40)  --size of pfd structure
    poke(pfd + 2, 1) --version
poke4(pfd + 4,
    or_all({PFD_DRAW_TO_WINDOW,PFD_SUPPORT_OPENGL,PFD_DOUBLEBUFFER})) --properties
    flags
poke(pfd + 8, {PFD_TYPE_RGBA,
    and_bits(bits,#FF),0,0,0,0,0,0,0,0,0,0,0,0,0,16,0,0,0,0})
    poke4(pfd + 25, {0,0,0})

    hDC = c_func(GetDC,{hWnd})
    if not hDC then
        KillGLWindow()
if message_box("Can't create a GL device
        context","Error",or_bits(MB_OK,MB_ICONEXCLAMATION)) then end if
        return FALSE
    end if

    PixelFormat = c_func(ChoosePixelFormat,{hDC,pfd})
    if not PixelFormat then
        KillGLWindow()
if message_box("Can't find a suitable pixel
        format","Error",or_bits(MB_OK,MB_ICONEXCLAMATION)) then end if
        return FALSE
    end if

    if not (c_func(SetPixelFormat,{hDC,PixelFormat,pfd})) then
        KillGLWindow()
if message_box("Can't set the pixel
        format","Error",or_bits(MB_OK,MB_ICONEXCLAMATION)) then end if
        return FALSE
    end if

    if not c_func(DescribePixelFormat, {hDC,PixelFormat,40,pfd}) then
if message_box("Can't describe the pixel
        format","Error",or_bits(MB_OK,MB_ICONEXCLAMATION)) then end if
    end if

    hRC = c_func(wglCreateContext,{hDC})
    if not hRC then
        KillGLWindow()
if message_box("Can't create a GL rendering
        context","Error",or_bits(MB_OK,MB_ICONEXCLAMATION)) then end if
        return FALSE
    end if

    if not (c_func(wglMakeCurrent,{hDC,hRC})) then
        KillGLWindow()
if message_box("Can't activate the GL rendering
        context","Error",or_bits(MB_OK,MB_ICONEXCLAMATION)) then end if
        return FALSE
    end if

    if c_func(ShowWindow,{hWnd,SW_SHOW}) then end if
    if c_func(SetForegroundWindow,{hWnd}) then end if
    if c_func(SetFocus,{hWnd}) then end if

    ReSizeGLScene(width, height)

    if not InitGL() then
        KillGLWindow()
if message_box("Initialization
        failed","Error",or_bits(MB_OK,MB_ICONEXCLAMATION)) then end if
        return FALSE
    end if

    return TRUE

end function

constant PM_REMOVE = #0001, WM_QUIT = #0012, VK_ESCAPE = #1B, VK_F1 = #70
procedure WinMain()
    integer MSG, done, title, msg_message

    MSG = allocate(28)
    done = FALSE
    title = allocate_string("OpenGL")

if message_box("Would you like to run in fullscreen mode?","Start
    Fullscreen?",or_bits(MB_YESNO,MB_ICONQUESTION)) = IDNO then
        fullscreen = FALSE
    else
        fullscreen = TRUE
    end if


    if not CreateGLWindow(title,640,480,16,fullscreen) then
        --return 0
    end if

    while not done do
        if c_func(PeekMessageA,{MSG,NULL,0,0,PM_REMOVE}) then
            msg_message = and_bits(peek4u(MSG+4),#FFFF)
            if msg_message = WM_QUIT then
                done = TRUE
            else
                if c_func(TranslateMessage,{MSG}) then end if
                if c_func(DispatchMessageA,{MSG}) then end if
            end if
        else
            if active then
                if keys[VK_ESCAPE] then
                    done = TRUE
                else
                    if DrawGLScene() then end if
                    if c_func(wglSwapBuffers,{hDC}) then end if
                end if

                if keys[VK_F1] then
                    keys[VK_F1] = FALSE
                    KillGLWindow()
                    if fullscreen = 0 then
                        fullscreen = 1
                    else
                        fullscreen = 0
                    end if

                    if not CreateGLWindow(title,640,480,16,fullscreen) then
                        --return 0
                    end if
                end if
            end if
        end if
    end while

    KillGLWindow()
    --return peek4u(MSG + 8)

end procedure

WinMain()
--------------010601060303060907030605--

new topic     » goto parent     » topic index » view message » categorize

3. Re: The window that wont die

Thanks for the response anyway.

Brian Broker wrote:

>
>
>1evan wrote:
>  
>
>>Did my attachment not come through?  I'll try to resend it.
>>    
>>
>My apologies, I only use the Topica web interface (no attachments and no 
>indication that there were attachments; I wish Topica would at least 
>indicate that there were attachements).
>
>  
>>I am programming using the Windows API directly
>>    
>>
>Sorry... I try to avoid that sort of thing if at all possible.
>
>-- Brian
>
>
>
>TOPICA - Start your own email discussion group. FREE!
>
>

-- 
     |\      _,,,---,,_
    /,`.-'`'    -.  ;-;;,_
   |,4-  ) )-,_..;\ (  `'-'
  '---''(_/--'  `-'\_)`-'\_)

new topic     » goto parent     » topic index » view message » categorize

4. Re: The window that wont die

Could it be that SetCooperativeLevel and TestCooperativeLevel arent
implemented?
Im not an expert on OpenGL or any wrappers written by other Euphoprians for
this..
Im assuming that OpenGL is somewhat similar to DirectDraw.. 
 
Euman 
 
 
----- Original Message -----  
From: <1evan at sbcglobal.net> 
To: "EUforum" <EUforum at topica.com> 
Sent: Friday, May 23, 2003 3:05 PM 
Subject: Re: The window that wont die 
 
 
> ======== The Euphoria Mailing List ========  
>  
> Did my attachment not come through?  I'll try to resend it. 
> I am programming using the Windows API directly 
>  
> Here are the main functions I'm using for resizing the display: 
> c_func(ChangeDisplaySettingsA,{dmScreenSettings,CDS_FULLSCREEN}) 
> c_func(AdjustWindowRectEx,{WindowRect, dwStyle, FALSE, dwExStyle) 
> c_func(AdjustWindowRectEx,{WindowRect, dwStyle, FALSE, dwExStyle}) then  
> end if 
> c_func(CreateWindowExA,{dwExStyle, 
>                                    ClassName, 
>                                    title, 
>                                     
> or_all({WS_CLIPSIBLINGS,WS_CLIPCHILDREN,dwStyle}), 
>                                    0, 
>                                    0, 
>                                    peek4u(WindowRect + 4) -  
> peek4u(WindowRect), 
>                                    peek4u(WindowRect + 12) -  
> peek4u(WindowRect + 8), 
>                                    NULL, 
>                                    NULL, 
>                                    hInstance, 
>                                    NULL}) 
>  
> This seems to work.  The problem seems to be, before it goes through  
> these routines, the routine to kill the previous window doesn't work.  
>  That routine is as follows: 
> procedure KillGLWindow() 
>  
>     if fullscreen then 
>         if not c_func(ChangeDisplaySettingsA,{NULL,0) then end if 
>         if not c_func(ShowCursor,{TRUE}) then end if 
>     end if 
>  
>     if hRC then 
>         if not c_func(wglMakeCurrent,{NULL,NULL}) then 
>             if message_box("Release of DC and RC failed","Shutdown  
> Error",or_bits(MB_OK,MB_ICONINFORMATION)) then end if 
>         end if 
>  
>         if not c_func(wglDeleteContext,{hRC}) then 
>             if message_box("Release of Rendering Context  
> failed","Shutdown Error",or_bits(MB_OK,MB_ICONINFORMATION)) then end if 
>         end if 
>  
>         hRC  NULL 
>     end if 
>  
>     if hDC and not c_func(ReleaseDC,{hWnd,hDC}) then 
>         if message_box("Release of Device Context failed","Shutdown  
> Error",or_bits(MB_OK,MB_ICONINFORMATION)) then end if 
>         hDC  NULL 
>     end if 
>  
>     if hWnd and not c_func(DestroyWindow,{hWnd}) then 
>         if message_box("Release window failed!","Shutdown  
> Error",or_bits(MB_OK, MB_ICONINFORMATION)) then end if 
>         hWnd = NULL 
>     end if 
>  
>     if c_func(UnregisterClassA,{ClassName,hInstance) then 
>         if message_box("Could not unregister class","Shutdown  
> Error",or_bits(MB_OK,MB_ICONINFORMATION)) then end if 
>         hInstance = NULL 
>     end if 
>  
> end procedure 
>  
> Brian Broker wrote: 
>  
> > 
> > 
> >A couple of questions: 
> >1)  Are you using a windows programming library?  (If so, which one?) 
> >2)  How are you changing display modes? 
> > 
> >-- Brian 
> > 
> >1evan wrote: 
> >   
> > 
> >>A couple of problems: 
> >>1)  When I click on the quit button -the 'x' in the corner- I don't  
> >>receive WM_QUIT (0x0012).  I get WM_NCLBUTTONDOWN and WM_NCLBUTTONUP and  
> >>then 0x0118 which I can't find the meaning of.  Same for the minimize  
> >>and resize buttons. 
> >> 
> >>2)  When I try to change display modes from windowed to fullscreen, and  
> >>vice versa, the old window never gets killed. 
> >> 
> >>Pressing the 'Esc' button closes the app down just fine. 
> >> 
> >> 
> > 
> > 
> >TOPICA - Start your own email discussion group. FREE! 
> > 
> > 
>  
> --  
>      |\      _,,,---,,_ 
>     /,`.-'`'    -.  ;-;;,_ 
>    |,4-  ) )-,_..;\ (  `'-' 
>   '---''(_/--'  `-'\_)`-'\_) 
>  
> ==^=========================================== 
> This email was sent to: euman@belle 
> include dll.e 
> include machine.e 
> include msgbox.e 
>  
> without warning 
>  
> procedure not_found(sequence name) 
>     puts(1,'\n' & "Couldn't find " & name & '\n') 
>     while get_key() != 'n' do end while 
>     abort(1) 
> end procedure 
>  
> function or_all(sequence s) 
> -- or together all elements of a sequence 
>     atom result 
>  
>     result  0 
>     for i = 1 to length(s) do 
>     result  or_bits(result, s[i]) 
>     end for 
>     return result 
> end function 
>  
> function link_c_func(atom dll, sequence name, sequence args, atom result) 
> -- dynamically link a C routine as a Euphoria function 
>     integer handle 
>  
>     handle  define_c_func(dll, name, args, result) 
>     if handle = -1 then 
>     not_found(name) 
>     else 
>     return handle 
>     end if 
> end function 
>  
> function link_c_proc(atom dll, sequence name, sequence args) 
> -- dynamically link a C routine as a Euphoria function 
>     integer handle 
>  
>     handle = define_c_proc(dll, name, args) 
>     if handle = -1 then 
>     not_found(name) 
>     else 
>     return handle 
>     end if 
> end function 
>  
> integer ChangeDisplaySettingsA, ShowCursor, ReleaseDC, UnregisterClassA,
> GetModuleHandleA, LoadIconA,
>         LoadCursorA, RegisterClassA, AdjustWindowRectEx, CreateWindowExA,
>         DestroyWindow, GetDC,
>         ChoosePixelFormat, SetPixelFormat, DescribePixelFormat, ShowWindow,
>         SetForegroundWindow,
>         SetFocus, PostQuitMessage, DefWindowProcA, PeekMessageA,
>         TranslateMessage, DispatchMessageA,
>         GetLastError, FormatMessage 
>  
> integer glViewport, glMatrixMode, glLoadIdentity, gluPerspective,
> glShadeModel, glClearColor,
>         glClearDepth, glEnable, glDepthFunc, glHint, glClear, glTranslatef,
>         glBegin, glEnd, glVertex3f,
>         glColor3f, wglMakeCurrent, wglDeleteContext, 
>         wglCreateContext, wglSwapBuffers 
>  
> procedure link_dll_routines() 
>     atom kernel32, user32, gdi32, gl, glu 
>  
>     kernel32 = open_dll("kernel32.dll") 
>     if kernel32 = NULL then 
>         not_found("kernel32.dll") 
>     end if 
>  
>     user32 = open_dll("user32.dll") 
>     if user32 = NULL then 
>         not_found("user32.dll") 
>     end if 
>  
>     gdi32 = open_dll("gdi32.dll") 
>     if gdi32  NULL then 
>         not_found("gdi32.dll") 
>     end if 
>  
>     gl = open_dll("OpenGL32.dll") 
>     if gl  NULL then 
>         not_found("OpenGL32.dll") 
>     end if 
>  
>     glu  open_dll("glu32.dll") 
>     if glu = NULL then 
>         not_found("glu32.dll") 
>     end if 
>  
>     ChangeDisplaySettingsA  link_c_func(user32, "ChangeDisplaySettingsA",
>     {C_POINTER,C_DOUBLE}, C_LONG)
>     ShowCursor  link_c_func(user32, "ShowCursor", {C_INT, C_INT) 
>     ReleaseDC  link_c_func(user32, "ReleaseDC", {C_INT,C_INT}, C_INT) 
>     UnregisterClassA  link_c_func(user32, "UnregisterClassA",
>     {C_POINTER,C_INT}, C_INT)
>     GetModuleHandleA = link_c_func(kernel32, "GetModuleHandleA", {C_POINTER},
>     C_INT)
>     LoadIconA = link_c_func(user32, "LoadIconA", {C_INT,C_POINTER}, C_INT) 
>     LoadCursorA = link_c_func(user32, "LoadCursorA", {C_INT,C_POINTER, C_INT) 
>     RegisterClassA = link_c_func(user32, "RegisterClassA", {C_POINTER},
>     C_INT)
>     AdjustWindowRectEx = link_c_func(user32, "AdjustWindowRectEx",
>     {C_POINTER,C_DOUBLE,C_INT,C_DOUBLE}, C_INT)
>     CreateWindowExA = link_c_func(user32, "CreateWindowExA",
>     {C_INT,C_POINTER,C_POINTER,C_INT,C_INT,C_INT,
>                                                              
>                                                               C_INT,C_INT,C_INT,C_INT,C_INT,C_POINTER, C_INT)
>     DestroyWindow = link_c_func(user32, "GetDC", {C_INT}, C_INT) 
>     GetDC = link_c_func(user32, "GetDC", {C_INT}, C_INT) 
>     ChoosePixelFormat = link_c_func(gdi32, "ChoosePixelFormat",
>     {C_INT,C_POINTER}, C_INT)
>     SetPixelFormat = link_c_func(gdi32, "SetPixelFormat", {C_INT, C_INT,
>     C_POINTER}, C_INT)
>     DescribePixelFormat = link_c_func(gdi32, "DescribePixelFormat", {C_INT,
>     C_INT, C_UINT, C_POINTER, C_INT)
>     ShowWindow = link_c_func(user32, "ShowWindow", {C_INT,C_INT}, C_INT) 
>     SetForegroundWindow = link_c_func(user32, "SetForegroundWindow", {C_INT},
>     C_INT)
>     SetFocus = link_c_func(user32, "SetFocus", {C_INT}, C_INT) 
>     PostQuitMessage = link_c_proc(user32, "PostQuitMessage", {C_INT}) 
>     DefWindowProcA = link_c_func(user32, "DefWindowProcA",
>     {C_INT,C_INT,C_INT,C_INT, C_INT)
>     PeekMessageA  link_c_func(user32, "PeekMessageA",
>     {C_POINTER,C_INT,C_UINT,C_UINT,C_UINT,C_INT)
>     TranslateMessage  link_c_func(user32, "TranslateMessage", {C_POINTER},
>     C_INT)
>     DispatchMessageA = link_c_func(user32, "DispatchMessageA", {C_POINTER,
>     C_INT)
>     GetLastError  link_c_func(kernel32, "GetLastError", {}, C_INT) 
>     FormatMessage  link_c_func(kernel32,
>     "FormatMessageA",{C_INT,C_POINTER,C_INT,C_INT,C_POINTER,C_INT,C_POINTER},C_INT)
>  
>  
>     glViewport = link_c_proc(gl, "glViewport", {C_INT,C_INT,C_INT,C_INT) 
>     glMatrixMode = link_c_proc(gl, "glMatrixMode", {C_INT) 
>     glLoadIdentity = link_c_proc(gl, "glLoadIdentity", {}) 
>     gluPerspective  link_c_proc(glu, "gluPerspective",
>     {C_FLOAT,C_FLOAT,C_FLOAT,C_FLOAT)
>     glShadeModel = link_c_proc(gl, "glShadeModel", {C_INT) 
>     glClearColor = link_c_proc(gl, "glClearColor",
>     {C_FLOAT,C_FLOAT,C_FLOAT,C_FLOAT})
>     glClearDepth = link_c_proc(gl, "glClearDepth", {C_FLOAT}) 
>     glEnable = link_c_proc(gl, "glEnable", {C_INT}) 
>     glDepthFunc  link_c_proc(gl, "glDepthFunc", {C_INT) 
>     glHint = link_c_proc(gl, "glHint", {C_INT,C_INT) 
>     glClear  link_c_proc(gl, "glClear", {C_INT}) 
>     glTranslatef = link_c_proc(gl, "glTranslatef", {C_FLOAT,C_FLOAT,C_FLOAT}) 
>     glBegin = link_c_proc(gl, "glBegin", {C_INT}) 
>     glEnd = link_c_proc(gl, "glEnd", {) 
>     glVertex3f  link_c_proc(gl, "glVertex3f", {C_FLOAT,C_FLOAT,C_FLOAT}) 
>     glColor3f = link_c_proc(gl, "glColor3f", {C_FLOAT,C_FLOAT,C_FLOAT}) 
>     wglSwapBuffers  link_c_func(gl, "wglSwapBuffers", {C_INT, C_INT) 
>     wglDeleteContext = link_c_func(gl,"wglDeleteContext", {C_INT}, C_INT) 
>     wglCreateContext  link_c_func(gl, "wglCreateContext", {C_INT}, C_INT) 
>     wglMakeCurrent = link_c_func(gl, "wglMakeCurrent", {C_INT,C_INT}, C_INT) 
>  
> end procedure 
> link_dll_routines() 
>  
> --look up the error code in the system error messages and display the
> corresponding message
> procedure ErrorMsg(integer error_num, integer funcnum) 
>     atom Error_message  --address of the returned error message buffer 
>     integer i 
>  
>     Error_message = allocate(32) 
>     puts(1,'\n' & "System Error: ") 
>     i = 0 
>     if not
>     (c_func(FormatMessage,{#1100,NULL,error_num,0,Error_message,30,NULL})) then
>     else 
>         while peek(peek4u(Error_message) + i) != NULL do  --loop until the end
>         of the string
>             printf(1,"%s",peek(peek4u(Error_message) + i)) 
>             i += 1 
>         end while 
>         printf(1,"  %d\n",funcnum) 
>     end if 
>  
> end procedure 
>  
> atom hRC, hDC, hWnd, hInstance 
> sequence keys keys  repeat(0,256)  -- array to hold key presses 
> constant TRUE  1, FALSE = 0 
> integer active, fullscreen 
> active = TRUE 
> fullscreen = TRUE 
> hRC  NULL 
> hDC = NULL 
>  
> constant GL_PROJECTION  #1701, GL_MODELVIEW = #1700 
> procedure ReSizeGLScene(integer width, integer height) 
>     if height  0 then 
>         height  1 
>     end if 
>     c_proc(glViewport,{0,0,width,height) 
>     c_proc(glMatrixMode,{GL_PROJECTION}) 
>     c_proc(glLoadIdentity,{}) 
>     c_proc(gluPerspective,{45.0,(width*1.0)/(height*1.0),0.1,100.0}) 
>     c_proc(glMatrixMode,{GL_MODELVIEW) 
>     c_proc(glLoadIdentity,{) 
>  
> end procedure 
>  
> constant GL_SMOOTH = #1D01, GL_DEPTH_TEST = #0B71, GL_LEQUAL = #0203,
> GL_PERSPECTIVE_CORRECTION_HINT  #0C50,
>          GL_NICEST = #1102 
> function InitGL() 
>  
>     c_proc(glShadeModel,{GL_SMOOTH}) 
>     c_proc(glClearColor,{0.0,0.0,0.0,0.5) 
>     c_proc(glClearDepth,{1.0}) 
>     c_proc(glEnable,{GL_DEPTH_TEST}) 
>     c_proc(glDepthFunc,{GL_LEQUAL}) 
>     c_proc(glHint,{GL_PERSPECTIVE_CORRECTION_HINT,GL_NICEST}) 
>  
>     return TRUE 
>  
> end function 
>  
> constant GL_COLOR_BUFFER_BIT = #00004000, GL_DEPTH_BUFFER_BIT = #00000100,
> GL_TRIANGLES = #0004,
>          GL_QUADS = #0007 
> function DrawGLScene() 
>  
>     c_proc(glClear,{or_bits(GL_COLOR_BUFFER_BIT,GL_DEPTH_BUFFER_BIT)}) 
>     c_proc(glLoadIdentity,{}) 
>  
>     c_proc(glTranslatef,{1.5,0.0,-6.0}) 
>     c_proc(glBegin, {GL_TRIANGLES}) 
>     c_proc(glColor3f, {1.0,0.0,0.0}) 
>     c_proc(glVertex3f, {0.0,1.0,0.0}) 
>     c_proc(glColor3f, {0.0,1.0,0.0}) 
>     c_proc(glVertex3f, {-1.0,-1.0,0.0) 
>     c_proc(glColor3f, {0.0,0.0,1.0}) 
>     c_proc(glVertex3f, {1.0,-1.0,0.0}) 
>     c_proc(glEnd, {}) 
>  
>     c_proc(glTranslatef,{3.0,0.0,0.0) 
>     c_proc(glColor3f, {0.5,0.5,1.0}) 
>     c_proc(glBegin, {GL_QUADS) 
>     c_proc(glVertex3f, {-1.0,1.0,0.0) 
>     c_proc(glVertex3f, {1.0,1.0,0.0}) 
>     c_proc(glVertex3f, {1.0,-1.0,0.0}) 
>     c_proc(glVertex3f, {-1.0,-1.0,0.0) 
>     c_proc(glEnd, {}) 
>  
>     return TRUE 
>  
> end function 
>  
> integer ClassName 
> procedure KillGLWindow() 
>  
>     if fullscreen then 
>         if not c_func(ChangeDisplaySettingsA,{NULL,0}) then end if 
>         if not c_func(ShowCursor,{TRUE}) then end if 
>     end if 
>  
>     if hRC then 
>         if not c_func(wglMakeCurrent,{NULL,NULL}) then 
>             if message_box("Release of DC and RC failed","Shutdown
>             Error",or_bits(MB_OK,MB_ICONINFORMATION)) then end if
>         end if 
>  
>         if not c_func(wglDeleteContext,{hRC) then 
>             if message_box("Release of Rendering Context failed","Shutdown
>             Error",or_bits(MB_OK,MB_ICONINFORMATION)) then end if
>         end if 
>  
>         hRC  NULL 
>     end if 
>  
>     if hDC and not c_func(ReleaseDC,{hWnd,hDC}) then 
>         if message_box("Release of Device Context failed","Shutdown
>         Error",or_bits(MB_OK,MB_ICONINFORMATION)) then end if
>         hDC = NULL 
>     end if 
>  
>     if hWnd and not c_func(DestroyWindow,{hWnd}) then 
>         if message_box("Release window failed!","Shutdown
>         Error",or_bits(MB_OK, MB_ICONINFORMATION)) then end if
>         hWnd  NULL 
>     end if 
>  
>     if c_func(UnregisterClassA,{ClassName,hInstance}) then 
>         if message_box("Could not unregister class","Shutdown
>         Error",or_bits(MB_OK,MB_ICONINFORMATION)) then end if
>         hInstance = NULL 
>     end if 
>  
> end procedure 
>  
> constant WM_ACTIVATE  #0006, WM_SYSCOMMAND = #0112, SC_SCREENSAVE = #F140,
> SC_MONITORPOWER = #F170, WM_CLOSE = #0010,
>          WM_KEYDOWN = #0100, WM_KEYUP = #0101, WM_SIZE  #0005 
> function WndProc(atom hWnd, integer uMsg, atom wParam, atom lParam) 
> printf(1,"uMsg = 0x%4x\n",uMsg) 
>     if uMsg  WM_ACTIVATE then 
>         if not floor(wParam/#10000) then 
>             active = TRUE 
>         else 
>             active = FALSE 
>         end if 
>         return 0 
>     end if 
>  
>     if  uMsg  WM_SYSCOMMAND then 
>         if wParam  SC_SCREENSAVE then end if 
>         if wParam = SC_MONITORPOWER then end if 
>         return 0 
>     end if 
>  
>     if uMsg  WM_CLOSE then 
>         c_proc(PostQuitMessage,{0}) 
>         return 0 
>     end if 
>  
>     if uMsg  WM_KEYDOWN then 
>         keys[wParam]  TRUE 
>         return 0 
>     end if 
>  
>     if uMsg  WM_KEYUP then 
>         keys[wParam] = FALSE 
>         return 0 
>     end if 
>  
>     if uMsg = WM_SIZE then 
>         ReSizeGLScene(and_bits(lParam,#FFFF),floor(lParam/#10000)) 
>         return 0 
>     end if 
>  
>     return c_func(DefWindowProcA,{hWnd, uMsg, wParam, lParam}) 
>  
> end function 
>  
> constant CS_HREDRAW = #0002, CS_VREDRAW  #0001, CS_OWNDC  #0020, IDI_WINLOGO 
> 32517, IDC_ARROW = 32512
> function ClassRegistration() 
>     integer WndProcAddress, id, wc 
>  
>     id  routine_id("WndProc") 
>     if id = -1 then 
>     puts(1, "routine_id failed!\n") 
>     abort(1) 
>     end if 
>     wc  allocate(40) 
>     WndProcAddress = call_back(id) 
>     hInstance = c_func(GetModuleHandleA,{NULL}) 
>     ClassName = allocate_string("OpenGL") 
>     poke4(wc,or_all({CS_HREDRAW, CS_VREDRAW, CS_OWNDC})) 
>     poke4(wc+4,WndProcAddress) 
>     poke4(wc+8,0) 
>     poke4(wc+12,0) 
>     poke4(wc+16,hInstance) 
>     poke4(wc+20,c_func(LoadIconA,{NULL,IDI_WINLOG)) 
>     poke4(wc+24,c_func(LoadCursorA,{NULL, IDC_ARROW})) 
>     poke4(wc+28,NULL) 
>     poke4(wc+32,NULL) 
>     poke4(wc+36,ClassName) 
>  
>     if not c_func(RegisterClassA,{wc}) then 
>         if message_box("Failed to register class","Error",
>         or_bits(MB_OK,MB_ICONINFORMATION)) then end if
>         return FALSE 
>     else 
>         return TRUE 
>     end if 
>  
> end function 
>  
> constant DM_BITSPERPEL = #00040000, DM_PELSWIDTH = #00080000, DM_PELSHEIGHT =
> #00100000,
>          CDS_FULLSCREEN = #00000004, DISP_CHANGE_SUCCESSFUL = 0,
>          WS_EX_APPWINDOW = #00040000,
>          WS_POPUP  #80000000, WS_EX_WINDOWEDGE  #00000100, WS_CLIPSIBLINGS =
>          #04000000,
>          WS_OVERLAPPED = #00000000,WS_CAPTION = #00C00000, WS_SYSMENU =
>          #00080000, WS_THICKFRAME = #00040000,
>          WS_MINIMIZEBOX = #00020000, WS_MAXIMIZEBOX  #00010000,
>          WS_CLIPCHILDREN = #02000000,
>          PFD_DRAW_TO_WINDOW = #00000004, PFD_SUPPORT_OPENGL  #00000020,
>          PFD_DOUBLEBUFFER  #40000000,
>          PFD_TYPE_RGBA  0, SW_SHOW = 5, 
>          WS_OVERLAPPEDWINDOW =
>          or_all({WS_OVERLAPPED,WS_CAPTION,WS_SYSMENU,WS_THICKFRAME,WS_MINIMIZEBOX,WS_MAXIMIZEBOX})
> function CreateGLWindow(atom title, integer width, integer height, integer
> bits, integer fullscreenflag)
>     atom PixelFormat, wc, dmScreenSettings, pfd, WindowRect, dwExStyle,
>     dwStyle
> sequence s 
>     fullscreen = fullscreenflag 
>  
>     if ClassRegistration() then end if 
>  
>     if fullscreen then 
>         dmScreenSettings  allocate(156) 
>         mem_set(dmScreenSettings,0,156) 
>         s  int_to_bytes(156) 
>         poke(dmScreenSettings + 36,{s[1],s[2]}) 
>         poke4(dmScreenSettings +
>         40,or_all({DM_BITSPERPEL,DM_PELSWIDTH,DM_PELSHEIGHT}))
>         poke4(dmScreenSettings + 104, bits) 
>         poke4(dmScreenSettings + 108, width) 
>         poke4(dmScreenSettings + 112, height) 
>  
>         if c_func(ChangeDisplaySettingsA,{dmScreenSettings,CDS_FULLSCREEN}) !
>         DISP_CHANGE_SUCCESSFUL then
>             if message_box("The requested fullscreen mode is not supported
>             by\nyour video card. " &
>                            "Use windowed mode instead?","Error",
>                            or_bits(MB_YESNO,MB_ICONEXCLAMATION)) = IDYES then
>                 fullscreen  FALSE 
>             else 
>                 if message_box("Program will now
>                 close","Error",or_bits(MB_OK,MB_ICONSTOP)) then end if
>                 return FALSE 
>             end if 
>         end if 
>     end if 
>  
>     if fullscreen then 
>         dwExStyle = WS_EX_APPWINDOW 
>         dwStyle  WS_POPUP 
>         if c_func(ShowCursor,{FALSE}) then end if 
>     else 
>         dwExStyle = or_bits(WS_EX_APPWINDOW,WS_EX_WINDOWEDGE) 
>         dwStyle = WS_OVERLAPPEDWINDOW 
>     end if 
>  
>     WindowRect = allocate(16) 
>     poke4(WindowRect,0) 
>     poke4(WindowRect + 4,width) 
>     poke4(WindowRect + 8, 0) 
>     poke4(WindowRect + 12, height) 
>  
>     if c_func(AdjustWindowRectEx,{WindowRect, dwStyle, FALSE, dwExStyle}) then
>     end if
>     hWnd = c_func(CreateWindowExA,{dwExStyle, 
>                                    ClassName, 
>                                    title, 
>                                   
>                                    or_all({WS_CLIPSIBLINGS,WS_CLIPCHILDREN,dwStyle}),
>                                    0, 
>                                    0, 
>                                    peek4u(WindowRect + 4) -
>                                    peek4u(WindowRect),
>                                    peek4u(WindowRect + 12) - peek4u(WindowRect
>                                    + 8),
>                                    NULL, 
>                                    NULL, 
>                                    hInstance, 
>                                    NULL) 
>  
>     if hWnd = NULL then 
>         KillGLWindow() 
>         if message_box("Window creation
>         error","Error",or_bits(MB_OK,MB_ICONEXCLAMATION)) then end if
>         while not wait_key() do end while 
>         return FALSE 
>     end if 
>  
>     pfd = allocate(40) 
>     mem_set(pfd,0,40) 
>     poke(pfd, 40)  --size of pfd structure 
>     poke(pfd + 2, 1) --version 
>     poke4(pfd + 4,
>     or_all({PFD_DRAW_TO_WINDOW,PFD_SUPPORT_OPENGL,PFD_DOUBLEBUFFER})) --properties
>     flags
>     poke(pfd + 8, {PFD_TYPE_RGBA,
>     and_bits(bits,#FF),0,0,0,0,0,0,0,0,0,0,0,0,0,16,0,0,0,0)
>     poke4(pfd + 25, {0,0,0}) 
>  
>     hDC = c_func(GetDC,{hWnd}) 
>     if not hDC then 
>         KillGLWindow() 
>         if message_box("Can't create a GL device
>         context","Error",or_bits(MB_OK,MB_ICONEXCLAMATION)) then end if
>         return FALSE 
>     end if 
>  
>     PixelFormat = c_func(ChoosePixelFormat,{hDC,pfd}) 
>     if not PixelFormat then 
>         KillGLWindow() 
>         if message_box("Can't find a suitable pixel
>         format","Error",or_bits(MB_OK,MB_ICONEXCLAMATION)) then end if
>         return FALSE 
>     end if 
>  
>     if not (c_func(SetPixelFormat,{hDC,PixelFormat,pfd})) then 
>         KillGLWindow() 
>         if message_box("Can't set the pixel
>         format","Error",or_bits(MB_OK,MB_ICONEXCLAMATION)) then end if
>         return FALSE 
>     end if 
>  
>     if not c_func(DescribePixelFormat, {hDC,PixelFormat,40,pfd}) then 
>         if message_box("Can't describe the pixel
>         format","Error",or_bits(MB_OK,MB_ICONEXCLAMATION)) then end if
>     end if 
>  
>     hRC = c_func(wglCreateContext,{hDC}) 
>     if not hRC then 
>         KillGLWindow() 
>         if message_box("Can't create a GL rendering
>         context","Error",or_bits(MB_OK,MB_ICONEXCLAMATION)) then end if
>         return FALSE 
>     end if 
>  
>     if not (c_func(wglMakeCurrent,{hDC,hRC})) then 
>         KillGLWindow() 
>         if message_box("Can't activate the GL rendering
>         context","Error",or_bits(MB_OK,MB_ICONEXCLAMATION)) then end if
>         return FALSE 
>     end if 
>  
>     if c_func(ShowWindow,{hWnd,SW_SHOW}) then end if 
>     if c_func(SetForegroundWindow,{hWnd}) then end if 
>     if c_func(SetFocus,{hWnd) then end if 
>  
>     ReSizeGLScene(width, height) 
>  
>     if not InitGL() then 
>         KillGLWindow() 
>         if message_box("Initialization
>         failed","Error",or_bits(MB_OK,MB_ICONEXCLAMATION)) then end if
>         return FALSE 
>     end if 
>  
>     return TRUE 
>  
> end function 
>  
> constant PM_REMOVE = #0001, WM_QUIT  #0012, VK_ESCAPE = #1B, VK_F1 = #70 
> procedure WinMain() 
>     integer MSG, done, title, msg_message 
>  
>     MSG = allocate(28) 
>     done = FALSE 
>     title = allocate_string("OpenGL") 
>  
>     if message_box("Would you like to run in fullscreen mode?","Start
>     Fullscreen?",or_bits(MB_YESNO,MB_ICONQUESTION)) = IDNO then
>         fullscreen = FALSE 
>     else 
>         fullscreen = TRUE 
>     end if 
>  
>  
>     if not CreateGLWindow(title,640,480,16,fullscreen) then 
>         --return 0 
>     end if 
>  
>     while not done do 
>         if c_func(PeekMessageA,{MSG,NULL,0,0,PM_REMOVE) then 
>             msg_message = and_bits(peek4u(MSG+4),#FFFF) 
>             if msg_message = WM_QUIT then 
>                 done = TRUE 
>             else 
>                 if c_func(TranslateMessage,{MSG) then end if 
>                 if c_func(DispatchMessageA,{MSG}) then end if 
>             end if 
>         else 
>             if active then 
>                 if keys[VK_ESCAPE] then 
>                     done  TRUE 
>                 else 
>                     if DrawGLScene() then end if 
>                     if c_func(wglSwapBuffers,{hDC) then end if 
>                 end if 
>  
>                 if keys[VK_F1] then 
>                     keys[VK_F1] = FALSE 
>                     KillGLWindow() 
>                     if fullscreen = 0 then 
>                         fullscreen  1 
>                     else 
>                         fullscreen = 0 
>                     end if 
>  
>                     if not CreateGLWindow(title,640,480,16,fullscreen) then 
>                         --return 0 
>                     end if 
>                 end if 
>             end if 
>         end if 
>     end while 
>  
>     KillGLWindow() 
>     --return peek4u(MSG + 8) 
>  
> end procedure 
>  
> WinMain()

new topic     » goto parent     » topic index » view message » categorize

5. Re: The window that wont die

The problem is that you only call the default Windows processing for certain
window events and not others. If you recode the WndProc routine more along
the lines of ....


function WndProc(atom hWnd, atom uMsg, atom wParam, atom lParam)

    if uMsg = WM_ACTIVATE then
        if not floor(wParam/#10000) then
            active = TRUE
        else
            active = FALSE
        end if

    elsif  uMsg = WM_SYSCOMMAND then
        if wParam = SC_SCREENSAVE then end if
        if wParam = SC_MONITORPOWER then end if

    elsif uMsg = WM_CLOSE then
        c_proc(PostQuitMessage,{0})

    elsif uMsg = WM_KEYDOWN then
        keys[wParam] = TRUE

    elsif uMsg = WM_KEYUP then
        keys[wParam] = FALSE

    elsif uMsg = WM_SIZE then
        ReSizeGLScene(and_bits(lParam,#FFFF),floor(lParam/#10000))
    end if

    return c_func(DefWindowProcA,{hWnd, uMsg, wParam, lParam})

end function

you might have better luck.

Also after getting the PeekMessage return it might be faster to do ...

   msg_message = peek4u(MSG+4)

than what you are doing now.


There is still some issues with releasing resources when the window closes
but I'll leave that for you to fix (I haven't got time right now).

----------------
cheers,
Derek Parnell

----- Original Message -----
From: <1evan at sbcglobal.net>
To: "EUforum" <EUforum at topica.com>
Sent: Friday, May 23, 2003 10:09 PM
Subject: The window that wont die


>
>
> A couple of problems:
> 1)  When I click on the quit button -the 'x' in the corner- I don't
receive WM_QUIT (0x0012).  I get WM_NCLBUTTONDOWN and WM_NCLBUTTONUP and
then 0x0118 which I can't find the meaning of.  Same for the minimize and
resize buttons.
>
> 2)  When I try to change display modes from windowed to fullscreen, and
vice versa, the old window never gets killed.
>
> Pressing the 'Esc' button closes the app down just fine.
>
>
>
> TOPICA - Start your own email discussion group. FREE!
>
>


----------------------------------------------------------------------------
----


> include get.e
> include dll.e
> include machine.e
> include msgbox.e
>
> without warning
>
> procedure not_found(sequence name)
>     puts(1,'\n' & "Couldn't find " & name & '\n')
>     while get_key() != 'n' do end while
>     abort(1)
> end procedure
>
> function or_all(sequence s)
> -- or together all elements of a sequence
>     atom result
>
>     result = 0
>     for i = 1 to length(s) do
>     result = or_bits(result, s[i])
>     end for
>     return result
> end function
>
> function link_c_func(atom dll, sequence name, sequence args, atom result)
> -- dynamically link a C routine as a Euphoria function
>     integer handle
>
>     handle = define_c_func(dll, name, args, result)
>     if handle = -1 then
>     not_found(name)
>     else
>     return handle
>     end if
> end function
>
> function link_c_proc(atom dll, sequence name, sequence args)
> -- dynamically link a C routine as a Euphoria function
>     integer handle
>
>     handle = define_c_proc(dll, name, args)
>     if handle = -1 then
>     not_found(name)
>     else
>     return handle
>     end if
> end function
>
> integer ChangeDisplaySettingsA, ShowCursor, ReleaseDC, UnregisterClassA,
GetModuleHandleA, LoadIconA,
>         LoadCursorA, RegisterClassA, AdjustWindowRectEx, CreateWindowExA,
DestroyWindow, GetDC,
>         ChoosePixelFormat, SetPixelFormat, DescribePixelFormat,
ShowWindow, SetForegroundWindow,
>         SetFocus, PostQuitMessage, DefWindowProcA, PeekMessageA,
TranslateMessage, DispatchMessageA,
>         GetLastError, FormatMessage
>
> integer glViewport, glMatrixMode, glLoadIdentity, gluPerspective,
glShadeModel, glClearColor,
>         glClearDepth, glEnable, glDepthFunc, glHint, glClear,
glTranslatef, glBegin, glEnd, glVertex3f,
>         glColor3f, wglMakeCurrent, wglDeleteContext,
>         wglCreateContext, wglSwapBuffers
>
> procedure link_dll_routines()
>     atom kernel32, user32, gdi32, gl, glu
>
>     kernel32 = open_dll("kernel32.dll")
>     if kernel32 = NULL then
>         not_found("kernel32.dll")
>     end if
>
>     user32 = open_dll("user32.dll")
>     if user32 = NULL then
>         not_found("user32.dll")
>     end if
>
>     gdi32 = open_dll("gdi32.dll")
>     if gdi32 = NULL then
>         not_found("gdi32.dll")
>     end if
>
>     gl = open_dll("OpenGL32.dll")
>     if gl = NULL then
>         not_found("OpenGL32.dll")
>     end if
>
>     glu = open_dll("glu32.dll")
>     if glu = NULL then
>         not_found("glu32.dll")
>     end if
>
>     ChangeDisplaySettingsA = link_c_func(user32, "ChangeDisplaySettingsA",
{C_POINTER,C_DOUBLE}, C_LONG)
>     ShowCursor = link_c_func(user32, "ShowCursor", {C_INT}, C_INT)
>     ReleaseDC = link_c_func(user32, "ReleaseDC", {C_INT,C_INT}, C_INT)
>     UnregisterClassA = link_c_func(user32, "UnregisterClassA",
{C_POINTER,C_INT}, C_INT)
>     GetModuleHandleA = link_c_func(kernel32, "GetModuleHandleA",
{C_POINTER}, C_INT)
>     LoadIconA = link_c_func(user32, "LoadIconA", {C_INT,C_POINTER}, C_INT)
>     LoadCursorA = link_c_func(user32, "LoadCursorA", {C_INT,C_POINTER},
C_INT)
>     RegisterClassA = link_c_func(user32, "RegisterClassA", {C_POINTER},
C_INT)
>     AdjustWindowRectEx = link_c_func(user32, "AdjustWindowRectEx",
{C_POINTER,C_DOUBLE,C_INT,C_DOUBLE}, C_INT)
>     CreateWindowExA = link_c_func(user32, "CreateWindowExA",
{C_INT,C_POINTER,C_POINTER,C_INT,C_INT,C_INT,
>
C_INT,C_INT,C_INT,C_INT,C_INT,C_POINTER}, C_INT)
>     DestroyWindow = link_c_func(user32, "GetDC", {C_INT}, C_INT)
>     GetDC = link_c_func(user32, "GetDC", {C_INT}, C_INT)
>     ChoosePixelFormat = link_c_func(gdi32, "ChoosePixelFormat",
{C_INT,C_POINTER}, C_INT)
>     SetPixelFormat = link_c_func(gdi32, "SetPixelFormat", {C_INT, C_INT,
C_POINTER}, C_INT)
>     DescribePixelFormat = link_c_func(gdi32, "DescribePixelFormat",
{C_INT, C_INT, C_UINT, C_POINTER}, C_INT)
>     ShowWindow = link_c_func(user32, "ShowWindow", {C_INT,C_INT}, C_INT)
>     SetForegroundWindow = link_c_func(user32, "SetForegroundWindow",
{C_INT}, C_INT)
>     SetFocus = link_c_func(user32, "SetFocus", {C_INT}, C_INT)
>     PostQuitMessage = link_c_proc(user32, "PostQuitMessage", {C_INT})
>     DefWindowProcA = link_c_func(user32, "DefWindowProcA",
{C_INT,C_INT,C_INT,C_INT}, C_INT)
>     PeekMessageA = link_c_func(user32, "PeekMessageA",
{C_POINTER,C_INT,C_UINT,C_UINT,C_UINT},C_INT)
>     TranslateMessage = link_c_func(user32, "TranslateMessage",
{C_POINTER}, C_INT)
>     DispatchMessageA = link_c_func(user32, "DispatchMessageA",
{C_POINTER}, C_INT)
>     GetLastError = link_c_func(kernel32, "GetLastError", {}, C_INT)
>     FormatMessage = link_c_func(kernel32,
"FormatMessageA",{C_INT,C_POINTER,C_INT,C_INT,C_POINTER,C_INT,C_POINTER},C_I
NT)
>
>
>     glViewport = link_c_proc(gl, "glViewport", {C_INT,C_INT,C_INT,C_INT})
>     glMatrixMode = link_c_proc(gl, "glMatrixMode", {C_INT})
>     glLoadIdentity = link_c_proc(gl, "glLoadIdentity", {})
>     gluPerspective = link_c_proc(glu, "gluPerspective",
{C_FLOAT,C_FLOAT,C_FLOAT,C_FLOAT})
>     glShadeModel = link_c_proc(gl, "glShadeModel", {C_INT})
>     glClearColor = link_c_proc(gl, "glClearColor",
{C_FLOAT,C_FLOAT,C_FLOAT,C_FLOAT})
>     glClearDepth = link_c_proc(gl, "glClearDepth", {C_FLOAT})
>     glEnable = link_c_proc(gl, "glEnable", {C_INT})
>     glDepthFunc = link_c_proc(gl, "glDepthFunc", {C_INT})
>     glHint = link_c_proc(gl, "glHint", {C_INT,C_INT})
>     glClear = link_c_proc(gl, "glClear", {C_INT})
>     glTranslatef = link_c_proc(gl, "glTranslatef",
{C_FLOAT,C_FLOAT,C_FLOAT})
>     glBegin = link_c_proc(gl, "glBegin", {C_INT})
>     glEnd = link_c_proc(gl, "glEnd", {})
>     glVertex3f = link_c_proc(gl, "glVertex3f", {C_FLOAT,C_FLOAT,C_FLOAT})
>     glColor3f = link_c_proc(gl, "glColor3f", {C_FLOAT,C_FLOAT,C_FLOAT})
>     wglSwapBuffers = link_c_func(gl, "wglSwapBuffers", {C_INT}, C_INT)
>     wglDeleteContext = link_c_func(gl,"wglDeleteContext", {C_INT}, C_INT)
>     wglCreateContext = link_c_func(gl, "wglCreateContext", {C_INT}, C_INT)
>     wglMakeCurrent = link_c_func(gl, "wglMakeCurrent", {C_INT,C_INT},
C_INT)
>
> end procedure
> link_dll_routines()
>
> --look up the error code in the system error messages and display the
corresponding message
> procedure ErrorMsg(integer error_num, integer funcnum)
>     atom Error_message  --address of the returned error message buffer
>     integer i
>
>     Error_message = allocate(32)
>     puts(1,'\n' & "System Error: ")
>     i = 0
>     if not
(c_func(FormatMessage,{#1100,NULL,error_num,0,Error_message,30,NULL})) then
>     else
>         while peek(peek4u(Error_message) + i) != NULL do  --loop until the
end of the string
>             printf(1,"%s",peek(peek4u(Error_message) + i))
>             i += 1
>         end while
>         printf(1,"  %d\n",funcnum)
>     end if
>
> end procedure
>
> atom hRC, hDC, hWnd, hInstance
> sequence keys keys = repeat(0,256)
> constant TRUE = 1, FALSE = 0
> integer active, fullscreen
> active = TRUE
> fullscreen = TRUE
> hRC = NULL
> hDC = NULL
>
> constant GL_PROJECTION = #1701, GL_MODELVIEW = #1700
> procedure ReSizeGLScene(integer width, integer height)
>     if height = 0 then
>         height = 1
>     end if
>     c_proc(glViewport,{0,0,width,height})
>     c_proc(glMatrixMode,{GL_PROJECTION})
>     c_proc(glLoadIdentity,{})
>     c_proc(gluPerspective,{45.0,(width*1.0)/(height*1.0),0.1,100.0})
>     c_proc(glMatrixMode,{GL_MODELVIEW})
>     c_proc(glLoadIdentity,{})
>
> end procedure
>
> constant GL_SMOOTH = #1D01, GL_DEPTH_TEST = #0B71, GL_LEQUAL = #0203,
GL_PERSPECTIVE_CORRECTION_HINT = #0C50,
>          GL_NICEST = #1102
> function InitGL()
>
>     c_proc(glShadeModel,{GL_SMOOTH})
>     c_proc(glClearColor,{0.0,0.0,0.0,0.5})
>     c_proc(glClearDepth,{1.0})
>     c_proc(glEnable,{GL_DEPTH_TEST})
>     c_proc(glDepthFunc,{GL_LEQUAL})
>     c_proc(glHint,{GL_PERSPECTIVE_CORRECTION_HINT,GL_NICEST})
>
>     return TRUE
>
> end function
>
> constant GL_COLOR_BUFFER_BIT = #00004000, GL_DEPTH_BUFFER_BIT = #00000100,
GL_TRIANGLES = #0004,
>          GL_QUADS = #0007
> function DrawGLScene()
>
>     c_proc(glClear,{or_bits(GL_COLOR_BUFFER_BIT,GL_DEPTH_BUFFER_BIT)})
>     c_proc(glLoadIdentity,{})
>
>     c_proc(glTranslatef,{1.5,0.0,-6.0})
>     c_proc(glBegin, {GL_TRIANGLES})
>     c_proc(glColor3f, {1.0,0.0,0.0})
>     c_proc(glVertex3f, {0.0,1.0,0.0})
>     c_proc(glColor3f, {0.0,1.0,0.0})
>     c_proc(glVertex3f, {-1.0,-1.0,0.0})
>     c_proc(glColor3f, {0.0,0.0,1.0})
>     c_proc(glVertex3f, {1.0,-1.0,0.0})
>     c_proc(glEnd, {})
>
>     c_proc(glTranslatef,{3.0,0.0,0.0})
>     c_proc(glColor3f, {0.5,0.5,1.0})
>     c_proc(glBegin, {GL_QUADS})
>     c_proc(glVertex3f, {-1.0,1.0,0.0})
>     c_proc(glVertex3f, {1.0,1.0,0.0})
>     c_proc(glVertex3f, {1.0,-1.0,0.0})
>     c_proc(glVertex3f, {-1.0,-1.0,0.0})
>     c_proc(glEnd, {})
>
>     return TRUE
>
> end function
>
> integer ClassName
> procedure KillGLWindow()
>
>     if fullscreen then
>         if not c_func(ChangeDisplaySettingsA,{NULL,0}) then end if
>         if not c_func(ShowCursor,{TRUE}) then end if
>     end if
>
>     if hRC then
>         if not c_func(wglMakeCurrent,{NULL,NULL}) then
>             if message_box("Release of DC and RC failed","Shutdown
Error",or_bits(MB_OK,MB_ICONINFORMATION)) then end if
>         end if
>
>         if not c_func(wglDeleteContext,{hRC}) then
>             if message_box("Release of Rendering Context failed","Shutdown
Error",or_bits(MB_OK,MB_ICONINFORMATION)) then end if
>         end if
>
>         hRC = NULL
>     end if
>
>     if hDC and (not c_func(ReleaseDC,{hWnd,hDC})) then
>         if message_box("Release of Device Context failed","Shutdown
Error",or_bits(MB_OK,MB_ICONINFORMATION)) then end if
>         hDC = NULL
>     end if
>
>     if hWnd and (not c_func(DestroyWindow,{hWnd})) then
>         if message_box("Release window failed!","Shutdown
Error",or_bits(MB_OK, MB_ICONINFORMATION)) then end if
>         hWnd = NULL
>     end if
>
>     if c_func(UnregisterClassA,{ClassName,hInstance}) then
>         if message_box("Could not unregister class","Shutdown
Error",or_bits(MB_OK,MB_ICONINFORMATION)) then end if
>         hInstance = NULL
>     end if
>
> end procedure
>
> constant WM_ACTIVATE = #0006, WM_SYSCOMMAND = #0112, SC_SCREENSAVE =
#F140, SC_MONITORPOWER = #F170, WM_CLOSE = #0010,
>          WM_KEYDOWN = #0100, WM_KEYUP = #0101, WM_SIZE = #0005
> function WndProc(atom hWnd, atom uMsg, atom wParam, atom lParam)
>
>     if uMsg = WM_ACTIVATE then
>         if not floor(wParam/#10000) then
>             active = TRUE
>         else
>             active = FALSE
>         end if
>         return 0
>     end if
>
>     if  uMsg = WM_SYSCOMMAND then
>         if wParam = SC_SCREENSAVE then end if
>         if wParam = SC_MONITORPOWER then end if
>         return 0
>     end if
>
>     if uMsg = WM_CLOSE then
>         c_proc(PostQuitMessage,{0})
>         return 0
>     end if
>
>     if uMsg = WM_KEYDOWN then
>         keys[wParam] = TRUE
>         return 0
>     end if
>
>     if uMsg = WM_KEYUP then
>         keys[wParam] = FALSE
>         return 0
>     end if
>
>     if uMsg = WM_SIZE then
>         ReSizeGLScene(and_bits(lParam,#FFFF),floor(lParam/#10000))
>         return 0
>     end if
>
>     return c_func(DefWindowProcA,{hWnd, uMsg, wParam, lParam})
>
> end function
>
> constant CS_HREDRAW = #0002, CS_VREDRAW = #0001, CS_OWNDC = #0020,
IDI_WINLOGO = 32517, IDC_ARROW = 32512
> function ClassRegistration()
>     integer WndProcAddress, id, wc
>
>     id = routine_id("WndProc")
>     if id = -1 then
>     puts(1, "routine_id failed!\n")
>     abort(1)
>     end if
>     wc = allocate(40)
>     WndProcAddress = call_back(id)
>     hInstance = c_func(GetModuleHandleA,{NULL})
>     ClassName = allocate_string("OpenGL")
>     poke4(wc,or_all({CS_HREDRAW, CS_VREDRAW, CS_OWNDC}))
>     poke4(wc+4,WndProcAddress)
>     poke4(wc+8,0)
>     poke4(wc+12,0)
>     poke4(wc+16,hInstance)
>     poke4(wc+20,c_func(LoadIconA,{NULL,IDI_WINLOGO}))
>     poke4(wc+24,c_func(LoadCursorA,{NULL, IDC_ARROW}))
>     poke4(wc+28,NULL)
>     poke4(wc+32,NULL)
>     poke4(wc+36,ClassName)
>
>     if not c_func(RegisterClassA,{wc}) then
>         if message_box("Failed to register class","Error",
or_bits(MB_OK,MB_ICONINFORMATION)) then end if
>         return FALSE
>     else
>         return TRUE
>     end if
>
> end function
>
> constant DM_BITSPERPEL = #00040000, DM_PELSWIDTH = #00080000,
DM_PELSHEIGHT = #00100000,
>          CDS_FULLSCREEN = #00000004, DISP_CHANGE_SUCCESSFUL = 0,
WS_EX_APPWINDOW = #00040000,
>          WS_POPUP = #80000000, WS_EX_WINDOWEDGE = #00000100,
WS_CLIPSIBLINGS = #04000000,
>          WS_OVERLAPPED = #00000000,WS_CAPTION = #00C00000, WS_SYSMENU =
#00080000, WS_THICKFRAME = #00040000,
>          WS_MINIMIZEBOX = #00020000, WS_MAXIMIZEBOX = #00010000,
WS_CLIPCHILDREN = #02000000,
>          PFD_DRAW_TO_WINDOW = #00000004, PFD_SUPPORT_OPENGL = #00000020,
PFD_DOUBLEBUFFER = #40000000,
>          PFD_TYPE_RGBA = 0, SW_SHOW = 5,
>          WS_OVERLAPPEDWINDOW =
or_all({WS_OVERLAPPED,WS_CAPTION,WS_SYSMENU,WS_THICKFRAME,WS_MINIMIZEBOX,WS_
MAXIMIZEBOX})
> function CreateGLWindow(atom title, integer width, integer height, integer
bits, integer fullscreenflag)
>     atom PixelFormat, wc, dmScreenSettings, pfd, WindowRect, dwExStyle,
dwStyle
> sequence s
>     fullscreen = fullscreenflag
>
>     if ClassRegistration() then end if
>
>     if fullscreen then
>         dmScreenSettings = allocate(156)
>         mem_set(dmScreenSettings,0,156)
>         s = int_to_bytes(156)
>         poke(dmScreenSettings + 36,{s[1],s[2]})
>         poke4(dmScreenSettings +
40,or_all({DM_BITSPERPEL,DM_PELSWIDTH,DM_PELSHEIGHT}))
>         poke4(dmScreenSettings + 104, bits)
>         poke4(dmScreenSettings + 108, width)
>         poke4(dmScreenSettings + 112, height)
>
>         if
c_func(ChangeDisplaySettingsA,{dmScreenSettings,CDS_FULLSCREEN}) !=
DISP_CHANGE_SUCCESSFUL then
>             if message_box("The requested fullscreen mode is not supported
by\nyour video card. " &
>                            "Use windowed mode instead?","Error",
or_bits(MB_YESNO,MB_ICONEXCLAMATION)) = IDYES then
>                 fullscreen = FALSE
>             else
>                 if message_box("Program will now
close","Error",or_bits(MB_OK,MB_ICONSTOP)) then end if
>                 return FALSE
>             end if
>         end if
>     end if
>
>     if fullscreen then
>         dwExStyle = WS_EX_APPWINDOW
>         dwStyle = WS_POPUP
>         if c_func(ShowCursor,{FALSE}) then end if
>     else
>         dwExStyle = or_bits(WS_EX_APPWINDOW,WS_EX_WINDOWEDGE)
>         dwStyle = WS_OVERLAPPEDWINDOW
>     end if
>
>     WindowRect = allocate(16)
>     poke4(WindowRect,0)
>     poke4(WindowRect + 4,width)
>     poke4(WindowRect + 8, 0)
>     poke4(WindowRect + 12, height)
>
>     if c_func(AdjustWindowRectEx,{WindowRect, dwStyle, FALSE, dwExStyle})
then end if
>     hWnd = c_func(CreateWindowExA,{dwExStyle,
>                                    ClassName,
>                                    title,
>
or_all({WS_CLIPSIBLINGS,WS_CLIPCHILDREN,dwStyle}),
>                                    0,
>                                    0,
>                                    peek4u(WindowRect + 4) -
peek4u(WindowRect),
>                                    peek4u(WindowRect + 12) -
peek4u(WindowRect + 8),
>                                    NULL,
>                                    NULL,
>                                    hInstance,
>                                    NULL})
>
>     if hWnd = NULL then
>         KillGLWindow()
>         if message_box("Window creation
error","Error",or_bits(MB_OK,MB_ICONEXCLAMATION)) then end if
>         while not wait_key() do end while
>         return FALSE
>     end if
>
>     pfd = allocate(40)
>     mem_set(pfd,0,40)
>     poke(pfd, 40)
>     poke(pfd + 2, 1)
>     poke4(pfd + 4,
or_all({PFD_DRAW_TO_WINDOW,PFD_SUPPORT_OPENGL,PFD_DOUBLEBUFFER}))
>     poke(pfd + 8, {PFD_TYPE_RGBA,
and_bits(bits,#FF),0,0,0,0,0,0,0,0,0,0,0,0,0,16,0,0,0,0})
>     poke4(pfd + 25, {0,0,0})
>
>     hDC = c_func(GetDC,{hWnd})
>     if not hDC then
>         KillGLWindow()
>         if message_box("Can't create a GL device
context","Error",or_bits(MB_OK,MB_ICONEXCLAMATION)) then end if
>         return FALSE
>     end if
>
>     PixelFormat = c_func(ChoosePixelFormat,{hDC,pfd})
>     if not PixelFormat then
>         KillGLWindow()
>         if message_box("Can't find a suitable pixel
format","Error",or_bits(MB_OK,MB_ICONEXCLAMATION)) then end if
>         return FALSE
>     end if
>
>     if not (c_func(SetPixelFormat,{hDC,PixelFormat,pfd})) then
>         KillGLWindow()
>         if message_box("Can't set the pixel
format","Error",or_bits(MB_OK,MB_ICONEXCLAMATION)) then end if
>         return FALSE
>     end if
>
>     if not c_func(DescribePixelFormat, {hDC,PixelFormat,40,pfd}) then
>         if message_box("Can't describe the pixel
format","Error",or_bits(MB_OK,MB_ICONEXCLAMATION)) then end if
>     end if
>
>     hRC = c_func(wglCreateContext,{hDC})
>     if not hRC then
>         KillGLWindow()
>         if message_box("Can't create a GL rendering
context","Error",or_bits(MB_OK,MB_ICONEXCLAMATION)) then end if
>         return FALSE
>     end if
>
>     if not (c_func(wglMakeCurrent,{hDC,hRC})) then
>         KillGLWindow()
>         if message_box("Can't activate the GL rendering
context","Error",or_bits(MB_OK,MB_ICONEXCLAMATION)) then end if
>         return FALSE
>     end if
>
>     if c_func(ShowWindow,{hWnd,SW_SHOW}) then end if
>     if c_func(SetForegroundWindow,{hWnd}) then end if
>     if c_func(SetFocus,{hWnd}) then end if
>
>     ReSizeGLScene(width, height)
>
>     if not InitGL() then
>         KillGLWindow()
>         if message_box("Initialization
failed","Error",or_bits(MB_OK,MB_ICONEXCLAMATION)) then end if
>         return FALSE
>     end if
>
>     return TRUE
>
> end function
>
> constant PM_REMOVE = #0001, WM_QUIT = #0012, VK_ESCAPE = #1B, VK_F1 = #70
> procedure WinMain()
>     integer MSG, done, title, msg_message
>     sequence s
>
>     MSG = allocate(28)
>     done = FALSE
>     title = allocate_string("OpenGL")
>
>     if message_box("Would you like to run in fullscreen mode?","Start
Fullscreen?",or_bits(MB_YESNO,MB_ICONQUESTION)) = IDNO then
>         fullscreen = FALSE
>     else
>         fullscreen = TRUE
>     end if
>
>
>     if not CreateGLWindow(title,640,480,16,fullscreen) then
>         --return 0
>     end if
>
>     while not done do
>         if c_func(PeekMessageA,{MSG,NULL,0,0,PM_REMOVE}) then
>             s = peek({MSG+4,2})
>             msg_message = bytes_to_int({s[1],s[2],0,0})
>             printf(1,"msg.message = 0x%04x\n",msg_message)
>             if msg_message = WM_QUIT then
>                 done = TRUE
>                 if not wait_key() then end if
>             else
>                 if c_func(TranslateMessage,{MSG}) then end if
>                 if c_func(DispatchMessageA,{MSG}) then end if
>             end if
>         else
>             if active then
>                 if keys[VK_ESCAPE] then
>                     done = TRUE
>                 else
>                     if DrawGLScene() then end if
>                     if c_func(wglSwapBuffers,{hDC}) then end if
>                 end if
>
>                 if keys[VK_F1] then
>                     keys[VK_F1] = FALSE
>                     KillGLWindow()
>                     if fullscreen = 0 then
>                         fullscreen = 1
>                     else
>                         fullscreen = 0
>                     end if
>
>                     if not CreateGLWindow(title,640,480,16,fullscreen)
then
>                         --return 0
>                     end if
>                 end if
>             end if
>         end if
>     end while
>
>     KillGLWindow()
>     --return peek4u(MSG + 8)
>
> end procedure
>
> WinMain()

new topic     » goto parent     » topic index » view message » categorize

Search



Quick Links

User menu

Not signed in.

Misc Menu