Windows 7 maximum window loss Boundary

Source: Internet
Author: User

A strange bug was found on the company's products.

On a dual-display machine, when the product's main window is maximized, eight pixels are lost at the left and top boundary. The loss here means that it does not belong to this window anymore. Clicking this area will activate the following window. You can use setjavaswrgn to reset the window area to retrieve the Lost part, but the window will lose the Windows topic and become the classic title bar and border.

Finally, the problem code was identified using the brute force method, and the bug was reproduced through the demo program. The final cause is that a Win32 API updatelayeredwindow causes this problem.

It is easy to reproduce this bug. Create an MFC dialog box application, first maximize the window, and then use the window handle as a parameter to call the following method.

========================================================== ======================================
Static void reproducelostedge (hwnd)
{
// Set the window to layered
Int style = getwindowlongptr (hwnd, gwl_exstyle );
Setwindowlong (hwnd, gwl_exstyle, style | ws_ex_layered );

Point ptdst;
Ptdst. x = 1; // left edge will lost 1 + 8 Pixel
Ptdst. Y = 3; // top edge will lost 3 + 8 Pixel

// The parameter ptdst takes core effect,
// No edge wocould lost if use null as this argument
Updatelayeredwindow (hwnd, null, & ptdst, null, 0, null, 0 );
// Setlayeredwindowattributes (hwnd, 0, 0, lwa_alpha );
}
========================================================== ======================================

Each time the preceding reproduction method is executed, the boundaries of several pixels are lost on the basis of the original one. The number of lost pixels is affected by the ptdst parameter. If the parameter is a vertex (x, y), X + 8 pixels are lost at the left boundary, and Y + 8 pixels are lost at the upper boundary. The base 8 here should be the value that maximizes the window beyond the screen workspace. In addition, if ptdst is a null pointer, no bugs will occur. According to msdn, The ptdst here should be null, which is another aspect of incorrect usage.

The original code wants to set the window to completely transparent to hide it. Calling updatelayeredwindow here is an incorrect usage. It is correct to use setlayered?wattributes. But in any case, this should be a Windows bug. Currently, Windows 7 SP1 is reproduced on English and some German machines. However, if there is only one monitor, there is no such bug from XP, Vista to win7.

Finally, how can I recover a bug? Restart and logout are all possible. The simplest is to modify the display settings to use only one monitor, and then choose to restore the original settings during preview.

Related Article

Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.