Форум » GUI » Ширина области данных грида » Ответить

Ширина области данных грида

Pasha: Пусть грид живет в окне Как точно посчитать ширину области данных грида ? надо отнять ширину скроллбара: GetSysMetrics( SM_CYVSCROLL ) и еще что ? там этих констант SM_* ... много Дело в том, что я что-то не учитываю. У меня на winxp ширина получается точно, а на win7 - нет, какие-то красивости не учитываю

Ответов - 8

Dima: Pasha MMK спросить надо ,он Семерку юзает :)

ММК: Dima пишет: MMK спросить надо ,он Семерку юзает :) Слушаюсь, мой Генерал!!! :) Есть у меня примерчик- на бровсе при ресайзе пропорционально меняется ширина столбцов. Может натолкнет на мысль :)) #define SM_CYVSCROLL 20 #define SM_CXHSCROLL 21 #define SM_CXSCREEN 0 #define SM_CYSCREEN 1 #define SM_CYCAPTION 4 function main() local oWnd, oBrw local aArray := {} local aColWidth := array( 13 ) // 13 columns local nI, nWd, nHt, nFactor for nI = 1 to 20 aadd( aArray, { StrZero(nI,2),; SPACE( 5 ),; SPACE( 5 ),; SPACE( 5 ),; SPACE( 5 ),; SPACE( 5 ),; SPACE( 5 ),; SPACE( 5 ),; SPACE( 5 ),; SPACE( 5 ),; SPACE( 5 ),; SPACE( 5 ),; SPACE( 5 ) } ) next nWd := GetSysMetrics(SM_CXSCREEN) * .5 nHt := GetSysMetrics(SM_CYSCREEN) * .3 DEFINE WINDOW oWnd Title "Test Resized xBrowse " from 50,0 to nHt, nWd PIXEL oBrw:= txbrowse():new( oWnd ) oBrw:nRowHeight := 25 oBrw:nColDividerStyle := LINESTYLE_BLACK oBrw:nRowDividerStyle := LINESTYLE_BLACK oBrw:nMarqueeStyle := MARQSTYLE_HIGHLCELL oBrw:SetArray( aArray ) oBrw:CreateFromCode() oBrw:lRecordSelector := .t. oBrw:lVScroll := .t. oBrw:nWidth := oWnd:nWidth - if( oBrw:lVScroll, GetSysMetrics(SM_CYVSCROLL), 0 ) oBrw:nHeight := oWnd:nHeight - GetSysMetrics(SM_CYCAPTION) - if( oBrw:lVScroll, GetSysMetrics( SM_CYVSCROLL ),0) nFactor := ( ( if( oBrw:lRecordSelector,55,30) + ; if( oBrw:lVScroll, GetSysMetrics( SM_CYVSCROLL ),15) ) / oWnd:nWidth ) / len( aColWidth ) aColWidth[ 1 ]:= 0.1 oBrw:aCols[ 1 ]:nWidth := oBrw:nWidth * ( aColWidth[ 1 ] - nFactor ) for nI = 2 to len( oBrw:aCols ) aColWidth[ nI ] := 0.9 / ( len( aColWidth ) - 1 ) oBrw:aCols[ nI ]:nWidth := oBrw:nWidth * ( aColWidth[ nI ] - nFactor ) next oWnd:bResized := {|| nFactor := ( ( if( oBrw:lRecordSelector,55,30) + ; if( oBrw:lVScroll, GetSysMetrics( SM_CYVSCROLL ),15) ) / oWnd:nWidth ) / len( aColWidth ) ,; oBrw:nWidth := oWnd:nWidth - if( oBrw:lVScroll, GetSysMetrics(SM_CYVSCROLL), 0 ) ,; aeval( oBrw:aCols, {| o,nI | o:nWidth := oBrw:nWidth * ( aColWidth[ nI ] - nFactor ) } ),; oBrw:Refresh() } ACTIVATE WINDOW oWnd

Pasha: Я уточню задачу. Пусть я уже посчитал ширину области данных грида nWidth. И мне надо расчитать ширину окна, в которое этот грид надо затолкать, чтобы попасть пиксель-в-пикель Я к nWidth прибавляю GetSysMetrics( SM_CYVSCROLL ), еще несколько пикселей, определенных эмпирически, и в xp попадаю. А в семерке - нет Там может граница окна шире. Как ее учесть ?


fil: Может, учитывая версию Windows, иметь глобальный корректор координат ?

Dima: Pasha Не оно ? SM_CXFRAME // тебе нужно это SM_CYFRAME

ММК: fil пишет: и в xp попадаю. А в семерке - нет Там может граница окна шире. Как ее учесть ? Вот "картинка " примера При разворачивании (max) левая и правая границы ( на рис.отмечено знаком ! ) не отображаются, но это вообще для всех окон Можно увидеть , что получается и что должно быть?

Dima: Pasha Глянь , может чем поможет http://www.rsdn.ru/forum/winapi/2762701.flat.1.aspx

Pasha: Dima пишет: Глянь , может чем поможет http://www.rsdn.ru/forum/winapi/2762701.flat.1.aspx Спасибо, этот оно Буду учитывать параметры: SM_CXDLGFRAME ? SM_CXBORDER 1 window border width SM_CXEDGE 2 window 3d border width SM_CXSIZEFRAME 4 window sizing frame width SM_CXVSCROLL 17



полная версия страницы