chzj589 发表于 2017-9-8 10:19:01

回复 15# kk_lee69
你的这种方法就不错,
修改显示为千位豆号,点击后显示为消除千位豆号。
这样就不用修改数据库的读取与写入。
但有一点,使用者一定要先确认是否千位豆号,才能写入数据库 

kk_lee69 发表于 2017-9-8 10:26:14

回复 16# chzj589

更貼近我想要的效果的是 這個你單點看看

我想把顯示 跟 存放資料分開

顯示歸顯示實際資料歸實際資料

只是我希望是INPUT 控件 不是 LISTVIEW

#PRE_UseX64=n
#include <WindowsConstants.au3>
#include <GUIConstantsEx.au3>
#include <GuiImageList.au3>
;#include <WinAPITheme.au3>
#include <GuiListView.au3>
#include <WinAPISys.au3>
#include <WinAPI.au3>
#include <GuiEdit.au3>
#include <array.au3>
#include <Misc.au3>

Global $B_DESCENDING

Global $hActLst
Global $bCtrlDown = False
Global $hEdit, $Item = -1, $SubItem = 0
Global $hEnter, $aAccelKeys = [["{ENTER}", $hEnter]]
$iSelItem=-1
Local $hUser32 = DllOpen("user32.dll")
Local $ichked = 0
Local $tText = DllStructCreate("wchar Text")
Local $GUI, $hImage
Local $iITEM_COUNT = 1000, $aShowdata[$iITEM_COUNT], $aShowdata2[$iITEM_COUNT], $aShowdata3[$iITEM_COUNT]
Local $sSomeString = ""
Local $hGUI, $hListView, $hListView2, $hListView3

GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")
$hGUI = GUICreate("ListView[" & UBound($aShowdata) & "]", 600, 605)


$hListView2 = GUICtrlCreateListView("$hListView2| | ", 300, 2, 295, 296, BitOR($LVS_REPORT, $LVS_SINGLESEL, $LVS_SHOWSELALWAYS, $LVS_OWNERDATA), $LVS_EX_GRIDLINES + $LVS_EX_FULLROWSELECT+ $LVS_EX_CHECKBOXES+ $LVS_EX_DOUBLEBUFFER);+ $LVS_EX_DOUBLEBUFFER
;~ _WinAPI_SetWindowTheme(GUICtrlGetHandle($hListView), "Explorer");


GUICtrlSendMsg($hListView2, $LVM_SETCOLUMNWIDTH, 0, 110)
GUICtrlSendMsg($hListView2, $LVM_SETCOLUMNWIDTH, 1, 80)
GUICtrlSendMsg($hListView2, $LVM_SETCOLUMNWIDTH, 2, 80)
GUICtrlSendMsg($hListView2, $LVM_SETITEMCOUNT, $iITEM_COUNT, 0);



$hImage = _GUIImageList_Create()
_GUIImageList_AddIcon($hImage, @SystemDir & "\shell32.dll", 110)
_GUICtrlListView_SetImageList($hListView, $hImage, 1);
_GUICtrlListView_SetImageList($hListView2, $hImage, 1);

GUISetState()


For $i = 0 To $iITEM_COUNT - 1

    If $i = 18 Then
      GUICtrlSendMsg($hListView, $LVM_REDRAWITEMS, 0, $i)
      GUICtrlSendMsg($hListView2, $LVM_REDRAWITEMS, 0, $i)
      GUICtrlSendMsg($hListView3, $LVM_REDRAWITEMS, 0, $i)
    EndIf
   
   
    $aShowdata2[$i] = "100"
    $aShowdata2[$i] = "1000"
    $aShowdata2[$i] = "1000000"
    $aShowdata2[$i] = 4096;
   
   
Next

While 1
    $bCtrlDown = _IsPressed("11", $hUser32);
    Switch GUIGetMsg()
      Case -3
            ExitLoop

    EndSwitch
WEnd
GUIDelete()
DllClose($hUser32)

Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
    #forceref $hWnd, $iMsg, $iwParam
    Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR, $tInfo

    $tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
    $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
    $iIDFrom = DllStructGetData($tNMHDR, "IDFrom")
    $iCode = DllStructGetData($tNMHDR, "Code")
   
    Switch $iIDFrom
      Case $hListView2
            Switch $iCode
                ;Case -150, -177 ;$LVN_GETDISPINFOA = -150, $LVN_GETDISPINFOW = -177   
                Case -177 ; $LVN_GETDISPINFOW = -177   
                  _LVN_GETDISPINFO($iIDFrom, $ilParam, $aShowdata2)
                Case $LVN_COLUMNCLICK ;

               
                                Case $NM_CLICK;按一下
                                       $tInfo = DllStructCreate($tagNMITEMACTIVATE, $ilParam)
                                        $iIndex = DllStructGetData($tInfo, "Index")
                                        $x = DllStructGetData($tInfo, "X")
                               
                                        ConsoleWrite("原始資料為:"&$aShowdata2[$iIndex]&" "&$aShowdata2[$iIndex]&" "&$aShowdata2[$iIndex]&@CRLF)

                  
                Case $LVN_BEGINSCROLL ;
   

                Case $NM_DBLCLK ;

            EndSwitch

    EndSwitch
    Return $GUI_RUNDEFMSG
EndFunc


Func _LVN_GETDISPINFO($hlst, $ilParam, ByRef $aDataArray)
    If Not IsArray($aDataArray) Then Return
    $tInfo = DllStructCreate($tagNMLVDISPINFO, $ilParam)
    $iIndex = Int(DllStructGetData($tInfo, "Item"))
    $iSub = Int(DllStructGetData($tInfo, "SubItem"))

    If BitAND(DllStructGetData($tInfo, "Mask"), $LVIF_IMAGE) And $iSub = 0 Then DllStructSetData($tInfo, "Image", 0)

    If (BitAND(_GUICtrlListView_GetExtendedListViewStyle($hlst), $LVS_EX_CHECKBOXES) = $LVS_EX_CHECKBOXES) Then

      DllStructSetData($tInfo, "Mask", BitOR($LVIF_STATE, DllStructGetData($tInfo, "Mask")))
      DllStructSetData($tInfo, "StateMask", $LVIS_STATEIMAGEMASK)
      DllStructSetData($tInfo, "State", $aDataArray[$iIndex])
    EndIf

    DllStructSetData($tText, "Text", StringRegExpReplace($aDataArray[$iIndex][$iSub], "(?<=(?<!\.)\d)(?=(?:\d{3})+(?:\D|\Z))", ","))
    DllStructSetData($tInfo, "Text", DllStructGetPtr($tText))
    DllStructSetData($tInfo, "TextMax", StringLen($aDataArray[$iIndex][$iSub]))
EndFunc


chzj589 发表于 2017-9-8 10:34:20

回复 17# kk_lee69
怎么说,
是INPUT 控件 实际的,没有千位豆号
LISTVIEW 有千位豆号

kk_lee69 发表于 2017-9-8 10:36:29

回复 18# chzj589

對 所以實際上我想自繪 INPUT控件這樣就可以在顯示 INPUT控件的時候秀出 ,

但是 實際資料存在 INPUT 控件上的是沒有 , 的

chzj589 发表于 2017-9-8 10:57:24

回复 19# kk_lee69
在窗口添加

        $Input1 = GUICtrlCreateInput("1", 20, 50, 80, 30)
        $Input2 = GUICtrlCreateInput("Input2", 20, 100, 80, 30)
        $Input3 = GUICtrlCreateInput("Input3", 20, 150, 80, 30)
在 ConsoleWrite("原始資料為:"&$aShowdata2[$iIndex]&" "&$aShowdata2[$iIndex]&" "&$aShowdata2[$iIndex]&@CRLF) 后面添加
        GUICtrlSetData($Input1, $aShowdata2[$iIndex])
        GUICtrlSetData($Input2, $aShowdata2[$iIndex])
        GUICtrlSetData($Input3, $aShowdata2[$iIndex])
不知这样可行?

kk_lee69 发表于 2017-9-8 11:02:45

回复 20# chzj589

這個不就是 yamakawa想的邏輯用兩個 INPUT控件來做之類的

chzj589 发表于 2017-9-8 11:24:35

回复 21# kk_lee69

查看操作了Excel,是需要设置单元格才能有这样的效果。
那用配置文件INI来操作?

kk_lee69 发表于 2017-9-8 11:43:49

回复 22# chzj589

如果達不到 真的要做就用原本的方法

只是覺得稍嫌麻煩了點

chzj589 发表于 2017-9-8 12:36:14

回复 23# kk_lee69
也不会啊。
一个数据库有几张表?
一张表只要修改读取与写入两处就行了。

minidick 发表于 2017-9-8 13:46:46

楼主的意思是想拦截Input绘制之类的系统消息,再自定义美化或格式化。这样创建任意多个Input,都不需要格外处理,一劳永逸。

kk_lee69 发表于 2017-9-8 15:22:02

回复 25# minidick

正解的確是我最終的希望

minidick 发表于 2017-9-9 11:51:12

回复 26# kk_lee69
但是拦截WM_PAINT,会涉及到所有的控件,导致GUI性能严重下降,可能会得不偿失。
ListView拦截的是WM_NOTIFY,影响较小。

yamakawa 发表于 2017-9-9 22:08:28

回复 17# kk_lee69


    这不就是我下面那个做法么。。数据保存在数组,显示的是其他数值

yamakawa 发表于 2017-9-9 22:10:17

另外,虽然不推荐,但是截获wm_paint是可以的,,控件子类化技术,只是截获input控件的paint消息

kk_lee69 发表于 2017-9-11 00:57:51

回复 29# yamakawa

所以我才問你 是否有辦法攔截 INPUT 的 PAINT 消息
我需要的是 INPUT控件不是 LISTVIEW

LISTVIEW 我大概知道怎麼做了
页: 1 [2] 3 4
查看完整版本: 有办法像EXCEL一样单元格内容与显示格式 可以不一样吗??数字的千分号