Точные размеры окон
Posted: Mon Jan 16, 2006 5:27 pm
Оказывается, когда при создании окна в функции 0 указываются (и заносятся во внутренние переменные ядра) размеры по осям x,y, реальные ширина и высота на один пиксель больше! (При этом код прорисовки рамки работает правильно). Это незаметно для обычных окон, но становится существенным для окон нестандартной формы. В документации по поводу функции 50 (установка нестандартной формы) сказано, что в данных 0 соответствует отсутствию пикселя, 1 соответствует наличию, прочие значения зарезервированы. Нетрудно догадаться, что имеется в виду двумерный массив, казалось бы, размеров xsize*ysize. Так вот, правильные размеры этого массива должны быть (xsize+1)>>scale * (ysize+1)>>scale, что совершенно нетривиально. Об этом есть комментарий в исходниках circle.asm, но до исходников нужно еще добраться и в документацию они не входят. Кстати, если xsize+1 не делится на 2^scale нацело, то будут глюки, на правой границе кусок формы окна будет браться с левой границы одним пикселем ниже.
Это же объясняет возвращаемое значение функции получения размеров desktop'а. В sysfuncr.txt по этому поводу сказано только, что "возвращаемое значение в eax" без пояснений по поводу формата этого значения. Конечно, по аналогии с другими функциями можно догадаться, что eax=xsize*65536+ysize, но при этом xsize,ysize - размеры окна desktop'a, которые на единицу меньше размеров всего рабочего стола.
Это же объясняет возвращаемое значение функции получения размеров desktop'а. В sysfuncr.txt по этому поводу сказано только, что "возвращаемое значение в eax" без пояснений по поводу формата этого значения. Конечно, по аналогии с другими функциями можно догадаться, что eax=xsize*65536+ysize, но при этом xsize,ysize - размеры окна desktop'a, которые на единицу меньше размеров всего рабочего стола.