Từ 1 tới 9 trên tổng số 9 kết quả

Đề tài: [VC6]Question: Làm sao để tạo một window full screen nhỉ ?

  1. #1
    Ngày gia nhập
    01 2007
    Nơi ở
    Hải Phòng
    Bài viết
    210

    Mặc định [VC6]Question: Làm sao để tạo một window full screen nhỉ ?

    Chơi game, nó full screen thấy hay quá, hỏi các bác xem làm thế nào để nó full screen nhỉ. Nếu làm được full screen rùi, thì cũng chỉ dùm luôn cách nó nhỏ lại nhé. Thank !

  2. #2
    Ngày gia nhập
    11 2006
    Bài viết
    75

    Search MSDN for "ChangeDisplaySettings".

    P.S: you should GOOGLE before asking any question.
    Our dreams are young and we both know they take us where we want to go...

  3. #3
    Ngày gia nhập
    01 2007
    Nơi ở
    Hải Phòng
    Bài viết
    210

    you should GOOGLE before asking any question.
    Đừng thấy tớ post nhiều câu hỏi quá mà cho rằng tớ là kẻ hay hỏi mà ko chịu tìm kiếm. Thực ra thì tớ đã google và search MSDN cả rồi. Tớ tìm với từ khóa "Visual C++ 6.0 Create Full Screen Window". Và kết quả là không như mong đợi.
    Vả lại, chuện gì cũng cứ google và MSDN thì có lẽ chúng ta nên dẹp cái 4rum này đi thôi.
    Dù sao thì cũng cảm ơn bạn rất nhiều.

  4. #4
    Ngày gia nhập
    07 2006
    Nơi ở
    Hanoi, Vietnam
    Bài viết
    2,750

    A common technique to create full screen applications is to expand the application window such that window elements like title bar, menu bar etc are beyond the visible region of the display. Only the client area will be visible.

    The example shown below modifies the class 'CMainFrame' to achieve the full screen effect. Expanding the application to full screen mode or to normal mode is done by a member function named 'ToggleView()'. The steps to achieve full screen functionality are as follows:

    Define a member variable of type 'CRect' (say 'm_rectFull') for the class 'CMainFrame' indicating the size of the window in full screen mode. 'm_rectFull' is calculated in the constructor of 'CMainFrame'.

    Code:
    CMainFrame::CMainFrame()
    {
      // TODO: add member initialization code here
    
      // Calculates window position and span in full screen mode
    
      // Calculates span of display area
      HDC hDC = ::GetDC(NULL);
      int XSpan = GetDeviceCaps(hDC, HORZRES);
      int YSpan = GetDeviceCaps(hDC, VERTRES);
      ::ReleaseDC(NULL, hDC);
    
      // Calculates size of window elements
      int XBorder = GetSystemMetrics(SM_CXFRAME);
      int YCaption = GetSystemMetrics(SM_CYCAPTION);
      int YMenu = GetSystemMetrics(SM_CYMENU);
      int YBorder = GetSystemMetrics(SM_CYFRAME);
    
      // Calculates window origin and span for full screen mode
      CPoint Origin = CPoint(-XBorder, -YBorder - YCaption - YMenu);
      XSpan += 2 * XBorder, YSpan += 2 * YBorder + YMenu + YCaption;
    
    
      // Calculates full screen window rectangle
      rectFull = CRect(Origin, CSize(XSpan, YSpan));
    }


    In the function 'ToggleView()', toggling of the view is carried out. Toolbar and status bar are hidden after storing their visibility status and the window is expanded such that only the client area will be visible. Size and position of the window is also stored before expanding. Calling 'ToggleView()' a second time, the window is displayed in the original size and position again.

    Here is the code for 'ToggleView()':

    Code:
    void CMainFrame::ToggleView()
    {
      // Previous window status parameters
      static CRect rectNormal;
      static boolFull = FALSE, boolStatus, boolTool;
    
      // Checks SDI / MDI application
      if (IsKindOf(RUNTIME_CLASS(CMDIFrameWnd)))
      {
        // MDI Application
        static nCmdShow;  // Previous child-window status
        CMDIChildWnd* pChild = ((CMDIFrameWnd*) this)->MDIGetActive();
        if (boolFull)
        {
          // Resets child window show status
          pChild->ShowWindow(nCmdShow);
        }
        else
        {
          // Gets child window show status
          WINDOWPLACEMENT WP;
          pChild->GetWindowPlacement(&WP);
          nCmdShow = WP.showCmd;
          
          // Maximizes child window
          pChild->ShowWindow(SW_SHOWMAXIMIZED);
        }
      }
      
      if (boolFull)
      {
        // Toggles from full screen to normal mode
        // Shows status bar and tool bar if they were visible
        if (boolStatus)
          m_wndStatusBar.ShowWindow(SW_SHOW);
      
        if (boolTool)
          m_wndToolBar.ShowWindow(SW_SHOW);
    
        RecalcLayout();
      }
      else
      {
        // Toggles from normal to full screen mode
        // Saves status bar and toolbar status and hides them
        if (boolStatus = m_wndStatusBar.IsWindowVisible())
          m_wndStatusBar.ShowWindow(SW_HIDE);
    
        if (boolTool = m_wndToolBar.IsWindowVisible())
          m_wndToolBar.ShowWindow(SW_HIDE);
      
        RecalcLayout();
      
        // Saves current window position and size
        GetWindowRect(rectNormal);
      }
    
      // Shows window in full screen / normal mode
      MoveWindow(boolFull ? rectNormal : rectFull);
      
      // Toggles window status
      boolFull = !boolFull;
    }

    This works for both for SDI and MDI applications.

    We have to set the maximum size and position of the window by overriding the message handler function 'CMainFrame::OnGetMinMaxInfo()', handling the 'WM_GETMINMAXINFO' message. Here is the message handler function:

    Code:
    void CMainFrame::OnGetMinMaxInfo(MINMAXINFO FAR* lpMMI) 
    {
      // TODO: Add your message handler code here and/or call default
    
      // Resets position and maximum window size for full screen mode
      lpMMI->ptMaxPosition = rectFull.TopLeft();
      lpMMI->ptMaxTrackSize = lpMMI->ptMaxSize = CPoint(rectFull.Size());
      CMDIFrameWnd::OnGetMinMaxInfo(lpMMI);
    }


    With this, a SDI application will expand to full screen mode on calling 'ToggleView()'. One can call this function from anywhere in the application by

    Code:
    ((CMainFrame*) AfxGetMainWnd())->ToggleView();


    One has to include the file 'MainFrm.h' if the 'CMainFrame' class is not defined where you make the function call.

    For an MDI application, you have to handle the 'WM_GETMINMAXINFO' message for the 'CChildFrame' class also to effect the expansion properly. 'CChildFrame::OnGetMinMaxInfo()' can be implemented as

    Code:

    Code:
    #include "MainFrm.h"
    
    void CChildFrame::OnGetMinMaxInfo(MINMAXINFO FAR* lpMMI) 
    {
      // TODO: Add your message handler code here and/or call default
    
      // Resets position and maximum child window size for full screen mode
      CSize Span = ((CMainFrame*) AfxGetMainWnd())->rectFull.Size();
      lpMMI->ptMaxPosition = ((CMainFrame*) AfxGetMainWnd())->rectFull.TopLeft();
      lpMMI->ptMaxTrackSize = lpMMI->ptMaxSize = CPoint(Span.cx, Span.cy);
      CMDIChildWnd::OnGetMinMaxInfo(lpMMI);
    }
    All this posted by Pravin Kumar in codeguru.com
    Email: admin[@]congdongcviet.com | CC to: info[@]congdongcviet.com
    Phone: 0972 89 7667 (Office: 04 6329 2380)
    Yahoo & Skype: dreaminess_world (Vui lòng chỉ rõ mục đích ngay khi liên hệ, cảm ơn!)

    Một người nào đó coi thường ý thức kỷ luật cũng có nghĩa là người đó đã coi thường tương lai số phận của chính bản thân người đó. Những người coi thường ý thức kỷ luật sẽ không bao giờ có được sự thành công trong sự nghiệp!

  5. #5
    Ngày gia nhập
    01 2007
    Nơi ở
    Hải Phòng
    Bài viết
    210

    Trích dẫn Nguyên bản được gửi bởi ilovecplusplus
    Search MSDN for "ChangeDisplaySettings".
    Hic ! Sau một hồi nghiên cứu trên mạng, tớ ko nhầm thì hàm này là hàm thay đổi độ phân giải màn hình chớ đâu có phải là hàm Full Screen.

    Trích dẫn Nguyên bản được gửi bởi Dreaminess
    int XSpan = GetDeviceCaps(hDC, HORZRES);
    int YSpan = GetDeviceCaps(hDC, VERTRES);

    // Calculates size of window elements
    int XBorder = GetSystemMetrics(SM_CXFRAME);
    int YCaption = GetSystemMetrics(SM_CYCAPTION);
    int YMenu = GetSystemMetrics(SM_CYMENU);
    int YBorder = GetSystemMetrics(SM_CYFRAME);

    // Calculates window origin and span for full screen mode
    CPoint Origin = CPoint(-XBorder, -YBorder - YCaption - YMenu);
    XSpan += 2 * XBorder, YSpan += 2 * YBorder + YMenu + YCaption;
    Hay đó, tớ sẽ biến hóa, dùng cái này với CreateWindowEx(WS_TOPMOST,...)
    Thế là nó Full Screen luôn. Tuy nhiên nếu kết hợp với ChangeDisplaySettings làm giảm độ phân giải màn hình đi một chút thì đúng là một game full screen đích thực.

    He he ! Many thank !

  6. #6
    Ngày gia nhập
    01 2007
    Nơi ở
    Hải Phòng
    Bài viết
    210

    Mặc định [VC6]Question: Làm sao để tạo một window full screen nhỉ ?

    Tui có 2 ý kiến thế này :
    1: Nên thay
    int XSpan = GetDeviceCaps(hDC, HORZRES);
    int YSpan = GetDeviceCaps(hDC, VERTRES);

    bằng
    XSpan = GetSystemMetrics(SM_CXSCREEN);
    YSpan = GetSystemMetrics(SM_CYSCREEN);

    Kết quả như nhau, nhưng cái GetSystemMetrics ko yêu cầu hDC.

    2: Ko hiểu sao, tui ko thể Full Screen được.
    Tui làm theo cách
    Trích dẫn Nguyên bản được gửi bởi hieubm
    Hay đó, tớ sẽ biến hóa, dùng cái này với CreateWindowEx(WS_TOPMOST,...)
    và ShowWindow(WndMain.hwnd,SW_SHOW);

    Thấy phần trên thì ổn rồi, nhưng phần đáy thì nó vẫn còn chừa ra một khoảng nhỏ ( mà cũng ko nhỏ lắm ). Thậm chí tớ tăng kích cỡ dọc của cửa sổ lên, nhưng nó chỉ có như vậy thôi

    ?????

  7. #7
    Ngày gia nhập
    07 2006
    Nơi ở
    Hà nội
    Bài viết
    204

    Làm gì mà khó khăn vậy, đơn giản thội mà. Trong style của window chỉ có WS_VISIBLE thì nó sẽ fullscreen. Dùng SetWindowLong (hWnd, GWL_STYLE, WS_VISIBLE);
    Code mẫu này (ấn escape để thoát, enter để xem):

    HINSTANCE hInst; // current instance

    ATOM MyRegisterClass(HINSTANCE hInstance); //Register Window Class
    BOOL InitInstance(HINSTANCE, int); //Initialize Controls
    LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM); //Main Window Procedure

    HWND hWnd; //Handle of Main Window

    RECT rect;
    long scrw, scrh;
    bool playing;
    DWORD ret;
    HANDLE AnimateThread;
    HDC picdc;

    void Animate ()
    {
    HFONT hFont = CreateFont (-MulDiv(20, GetDeviceCaps(GetDC (0), LOGPIXELSY), 72), 0, 0, 0, 400, FALSE, FALSE, FALSE, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, PROOF_QUALITY, DEFAULT_PITCH, "MS Sans Serif");
    SelectObject (picdc, hFont);
    HDC backsf = CreateCompatibleDC (picdc);
    HBITMAP bmp = CreateCompatibleBitmap (picdc, scrw, scrh);
    SelectObject (picdc, bmp);
    int r, g, b;
    r = 0; g = 0; b = 0;
    rect.top = 0;
    rect.left = 0; rect.right = scrw;
    rect.bottom = scrh;
    SIZE size;
    GetTextExtentPoint32 (picdc, "Do you understand ?", 19, &size);
    long posx = scrw / 2 - size.cx / 2;
    long posy = scrh / 2 - size.cy / 2;
    SetBkMode (picdc, TRANSPARENT);
    while (r <= 255)
    {
    SetTextColor (picdc, RGB (r,g,b));
    TextOut (picdc, posx, posy, "Do you understand ?", 19);
    r++;
    Sleep (20);
    };
    }

    int APIENTRY WinMain(HINSTANCE hInstance,
    HINSTANCE hPrevInstance,
    LPSTR lpCmdLine,
    int nCmdShow)
    {
    MSG msg;
    MyRegisterClass(hInstance);
    if (!InitInstance (hInstance, nCmdShow))
    {
    return FALSE;
    }

    while (GetMessage(&msg, NULL, 0, 0))
    {
    TranslateMessage(&msg);
    DispatchMessage(&msg);
    }

    return msg.wParam;
    }

    ATOM MyRegisterClass(HINSTANCE hInstance)
    {
    WNDCLASSEX wcex;
    wcex.cbSize = sizeof(WNDCLASSEX);
    wcex.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC;
    wcex.lpfnWndProc = (WNDPROC) WndProc;
    wcex.cbClsExtra = 0;
    wcex.cbWndExtra = 0;
    wcex.hInstance = hInstance;
    wcex.hIcon = LoadIcon(wcex.hInstance, NULL);
    wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
    wcex.hbrBackground = CreateSolidBrush ((COLORREF) 0);
    wcex.lpszMenuName = NULL;
    wcex.lpszClassName = "AppClass";
    wcex.hIconSm = LoadIcon(wcex.hInstance, NULL);

    return RegisterClassEx (&wcex);
    }

    BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
    {
    hInst = hInstance; // Store instance handle in our global variable

    GetWindowRect (GetDesktopWindow (), &rect);
    scrw = rect.right;
    scrh = rect.bottom;
    hWnd = CreateWindowEx (0, "AppClass", "Animate", WS_VISIBLE,
    0, 0, scrw, scrw, NULL, NULL, hInstance, NULL);
    if (!hWnd)
    {
    return FALSE;
    };
    SetWindowLong (hWnd, GWL_STYLE, WS_VISIBLE); //Full Screen
    return TRUE;
    }

    LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
    switch (message)
    {
    case WM_CREATE:
    picdc = GetDC (hWnd);
    break;
    case WM_KEYDOWN:
    if (wParam == VK_ESCAPE)
    {
    PostQuitMessage (0);
    }
    else if (wParam == VK_RETURN)
    {
    if (!playing)
    {
    AnimateThread = CreateThread (NULL, 0, (LPTHREAD_START_ROUTINE) Animate, NULL, 0, &ret);
    playing = true;
    }
    else
    {
    SuspendThread (AnimateThread);
    playing = false;
    };
    };
    break;
    case WM_DESTROY:
    PostQuitMessage (0);
    break;
    default:
    return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
    }
    Life:\> dir

  8. #8
    Ngày gia nhập
    01 2007
    Nơi ở
    Hải Phòng
    Bài viết
    210

    @hoanglinh9466 :
    Cao tay ! Hảo hảo ! Không ngờ vấn đề lại đơn giản như vậy. Trước nay, tớ vẫn nghĩ cái WS_VISIBLE làm cho cái cửa sổ nó tự hiện mà mình ko phải ShowWindow. Ko ngờ nó tiềm ẩn tài năng.
    Cảm ơn bạn nhiều nha.
    << Cho một phát Special Thanks >>

  9. #9
    Ngày gia nhập
    10 2006
    Nơi ở
    Rừng Amazon
    Bài viết
    101

    Có một cách nữa để làm với Dialog. Bạn tạo một Dialog không có title bar, sau đó cho show maximize thì sẽ được full screen.

Các đề tài tương tự

  1. Tạo Full Screen Form trong lập trình C#
    Gửi bởi Kevin Hoang trong diễn đàn Tutorials và Thủ thuật lập trình C#, ASP.NET
    Trả lời: 3
    Bài viết cuối: 10-05-2013, 05:33 PM
  2. chuyển đổi qua lại giữa full screen và winmode (game)
    Gửi bởi pe_bi19 trong diễn đàn Windows API, Hooking, xử lý Windows Message
    Trả lời: 1
    Bài viết cuối: 26-03-2012, 07:08 AM
  3. Tạo Dialog với full screen trong lập trình VC++
    Gửi bởi zkday2686 trong diễn đàn Tutorials và Thủ thuật Visual C++
    Trả lời: 2
    Bài viết cuối: 02-03-2009, 11:43 PM
  4. Tạo form full screen trong lập trình C#?
    Gửi bởi dieucay555 trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 11
    Bài viết cuối: 15-12-2008, 02:59 PM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn